void BookCopy::Update() { if (status_ == BookStatus::LENT) { NotifyOverdueIfNeeded(); } else if (status_ == BookStatus::AT_LOAN_DESK) { bool need_nodify = false; std::time_t today = Today(); while (std::difftime(today, due_date_) > 0.0) { // another one missed the book request_queue_.erase(request_queue_.begin()); if (request_queue_.empty()) { // all the people missed the book status_ = BookStatus::ON_SHELF; return; } else // move to next person { need_nodify = true; due_date_ = nDaysLater(due_date_, kReserveDays); } } // nodify the new person NotifyRequest(); } }
bool BookCopy::Borrow(User *user) { if (status_ == BookStatus::AT_LOAN_DESK && request_queue_.front() == user->id()) { // retrieve the book requested request_queue_.erase(request_queue_.begin()); } else if (status_ != BookStatus::ON_SHELF) { std::cout << "该馆藏不在架上,无法借取\n"; return false; } if (!(user->Borrow(id_))) // error info will be printed inside return false; // borrowed status_ = BookStatus::LENT; holder_ = user->id(); begin_date_ = Today(); if (borrow_type_ == BorrowType::GENERAL) due_date_ = nDaysLater(user->general_period()); else // BorrowType::SHORT due_date_ = nDaysLater(user->short_period()); renew_times_ = 0; recalled_ = false; return true; }
bool BookCopy::Request(User *user) { if (status_ != BookStatus::LENT) { std::cout << "只能预约当前被借出的馆藏\n"; return false; } if (!(user->Request(id_))) // error info will be printed inside return false; // requested if (!recalled_) // haven't been recalled yet, do it now { std::time_t today = Today(); if (DaysDiff(today, begin_date_) >= kMinHoldDays && DaysDiff(due_date_, today) > kDaysAfterRecall) { // should advance due date due_date_ = nDaysLater(kDaysAfterRecall); } NotifyRecall(); recalled_ = true; } request_queue_.push_back(user->id()); return true; }
void CreateID(char* pOut, char* pDate, char*pZh, char* wtbh) { if (pDate == nullptr || strlen(pDate) == 0) { sprintf(pOut, "%d:%s:%s", Today(0), pZh, wtbh); } else { sprintf(pOut, "%s:%s:%s", pDate, pZh, wtbh); } }
int RefreshContactListIcons(HANDLE hContact) { if (hContact == 0) return 0; int count = CallService(MS_DB_CONTACT_GETCOUNT, 0, 0); int hidden = db_get_b(hContact, "CList", "Hidden", 0); int ignored = db_get_dw(hContact, "Ignore", "Mask1", 0); ignored = ((ignored & 0x3f) != 0) ? 1 : 0; int ok = 1; if (commonData.notifyFor & EXCLUDE_HIDDEN) ok &= (hidden == 0); if (commonData.notifyFor & EXCLUDE_IGNORED) ok &= (ignored == 0); time_t today = Today(); int dtb = NotifyContactBirthday(hContact, today, commonData.daysInAdvance); int dab = NotifyMissedContactBirthday(hContact, today, commonData.daysAfter); if (ok && (dtb >= 0 || dab > 0)) { int age = GetContactAge(hContact); db_set_b(hContact, "UserInfo", "Age", age); if ((bShouldCheckBirthdays) && (commonData.bUsePopups)) { if (dtb >= 0) { bBirthdayFound = 1; //only set it if we're called from our CheckBirthdays service PopupNotifyBirthday(hContact, dtb, age); } else if (dab > 0) PopupNotifyMissedBirthday(hContact, dab, age); } if (bShouldCheckBirthdays) if (dtb >= 0) SoundNotifyBirthday(dtb); if ((bShouldCheckBirthdays) && (commonData.bUseDialog)) { if (dtb >= 0) DialogNotifyBirthday(hContact, dtb, age); else if (dab > 0) DialogNotifyMissedBirthday(hContact, dab, age); } if (dtb >= 0) ExtraIcon_SetIcon(hWWIExtraIcons, hContact, GetDTBIconHandle(dtb)); } else ExtraIcon_Clear(hWWIExtraIcons, hContact); return 0; }
DatePickerWindow initDatePicker() { DatePickerWindow w; w.selected = 0; w.date = Today(); w.window = window_create(); w.day.layer = text_layer_create(GRect(9, 66, 28, 35)); w.month.layer = text_layer_create(GRect(43, 66, 28, 35)); w.year.layer = text_layer_create(GRect(76, 66, 58, 35)); char* day = Day(&w.date); text_layer_set_text(w.day.layer, day); text_layer_set_font(w.day.layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); text_layer_set_text_alignment(w.day.layer, GTextAlignmentCenter); text_layer_set_background_color(w.day.layer, C_BACKGROUND); text_layer_set_text_color(w.day.layer, C_FOREGROUND); layer_add_child(window_get_root_layer(w.window), text_layer_get_layer(w.day.layer)); char* month = Month(&w.date); text_layer_set_text(w.month.layer, month); text_layer_set_font(w.month.layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); text_layer_set_text_alignment(w.month.layer, GTextAlignmentCenter); text_layer_set_background_color(w.month.layer, C_BACKGROUND); text_layer_set_text_color(w.month.layer, C_FOREGROUND); layer_add_child(window_get_root_layer(w.window), text_layer_get_layer(w.month.layer)); char* year = Year(&w.date); text_layer_set_text(w.year.layer, year); text_layer_set_font(w.year.layer, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD)); text_layer_set_text_alignment(w.year.layer, GTextAlignmentCenter); text_layer_set_background_color(w.year.layer, C_BACKGROUND); text_layer_set_text_color(w.year.layer, C_FOREGROUND); layer_add_child(window_get_root_layer(w.window), text_layer_get_layer(w.year.layer)); updateWhichSelected(w); window_set_click_config_provider_with_context(w.window, (ClickConfigProvider)config_provider, (void*)&w); return w; }
INT_PTR CheckBirthdaysService(WPARAM, LPARAM lParam) { bBirthdayFound = 0; //no birthdays have been found in the given interval SYSTEMTIME today; GetLocalTime(&today); DWORD lastChecked = db_get_dw(NULL, ModuleName, "LastChecked", 0); //get last checked date int lcDay = LOBYTE(LOWORD(lastChecked)); int lcMonth = HIBYTE(LOWORD(lastChecked)); int lcYear = HIWORD(lastChecked); int daysAfter = DaysAfterBirthday(Today(), lcYear, lcMonth, lcDay); //get difference between last checked date and today int savedDaysAfter = 0; savedDaysAfter = commonData.daysAfter; //save value if ((daysAfter > commonData.daysAfter) && (commonData.daysAfter > 0))//check for passed birthdays commonData.daysAfter = daysAfter; //bigger values of the two if ((lParam) && (commonData.bOncePerDay)) //if force check then we don't take OncePerDay into account if (lcDay == today.wDay && lcMonth == today.wMonth && lcYear == today.wYear) return 0; //already checked today bShouldCheckBirthdays = 1; RefreshAllContactListIcons(); if ((!bBirthdayFound) && (commonData.bNoBirthdaysPopup)) PopupNotifyNoBirthdays(); bShouldCheckBirthdays = 0; commonData.daysAfter = savedDaysAfter; //restore previous value if (lParam) //if not forced - i.e. timer check db_set_dw(NULL, ModuleName, "LastChecked", MAKELONG(MAKEWORD(today.wDay, today.wMonth), today.wYear)); //write the value in DB so we don't check again today return 0; }
int main(){ Date Today(4,18,2012); Date Maturity(12,31,2025); Date Purchase(2,28,2012); Bond Y("NYC_Obligation", 885.0, Purchase, Maturity); Bond *bond_ptr = new Bond("GW_Bridge_Obligation", 895.0, Purchase, Maturity); int Y_days = Y.daysToMaturity(Today); float Y_years = Y_days / 365; cout<<"The name of the First Bond is : "<< Y.get_name() <<endl; cout<<"The price of the First Bond is : "<< Y.get_price() << endl; cout<<"The difference between Maturity Date and Today's Date is: "<< Y_days << " Days."<<endl; cout<<"The difference between Maturity Date and Today's Date is: "<< Y_years << " Years."<<endl; int ptr_days = bond_ptr -> daysToMaturity(Today); float ptr_years = ptr_days / 365; cout<<"The name of the Second Bond is : "<< bond_ptr -> get_name() <<endl; cout<<"The price of the Second Bond is : "<< bond_ptr -> get_price() << endl; cout<<"The difference between Maturity Date and Today's Date is: "<<ptr_days<< " Days."<<endl; cout<<"The difference between Maturity Date and Today's Date is: "<<ptr_years<< " Years."<<endl; return 0; }
TDate TSecurity::StandardSettlement() const { return StandardSettlement( Today() ); }
int OnExtraImageApply(WPARAM wParam, LPARAM lParam) { HANDLE hContact = (HANDLE) wParam; if ((hContact)) { int count = CallService(MS_DB_CONTACT_GETCOUNT, 0, 0); //int daysInAdvance = DBGetContactSettingWord(NULL, ModuleName, "DaysInAdvance", DAYS_TO_NOTIFY); //int popupTimeout = DBGetContactSettingWord(NULL, ModuleName, "PopupTimeout", POPUP_TIMEOUT); //DWORD foreground = DBGetContactSettingDword(NULL, ModuleName, "Foreground", FOREGROUND_COLOR); //DWORD background = DBGetContactSettingDword(NULL, ModuleName, "Background", BACKGROUND_COLOR); //int bUsePopups = DBGetContactSettingByte(NULL, ModuleName, "UsePopups", TRUE); //int bUseClistIcon = DBGetContactSettingByte(NULL, ModuleName, "UseClistIcon", TRUE); //int bUseDialog = DBGetContactSettingByte(NULL, ModuleName, "UseDialog", TRUE); //int clistIcon = DBGetContactSettingByte(NULL, ModuleName, "AdvancedIcon", CLIST_ICON); //int notifyFor = DBGetContactSettingByte(NULL, ModuleName, "NotifyFor", 0); int hidden = DBGetContactSettingByte(hContact, "CList", "Hidden", 0); int ignored = DBGetContactSettingDword(hContact, "Ignore", "Mask1", 0); ignored = ((ignored & 0x3f) != 0) ? 1 : 0; int ok = 1; if (commonData.notifyFor & EXCLUDE_HIDDEN) { ok &= (hidden == 0); } if (commonData.notifyFor & EXCLUDE_IGNORED) { ok &= (ignored == 0); } int dtb; int dab; int caps = ServiceExists(MS_CLIST_EXTRA_ADD_ICON); // CallService(MS_CLUI_GETCAPS, 0, 0); time_t today = Today(); if ((ok) && (((dtb = NotifyContactBirthday(hContact, today, commonData.daysInAdvance)) >= 0) || ((dab = NotifyMissedContactBirthday(hContact, today, commonData.daysAfter)) > 0))) { int age = GetContactAge(hContact); DBWriteContactSettingByte(hContact, "UserInfo", "Age", age); if ((bShouldCheckBirthdays) && (commonData.bUsePopups)) { if (dtb >= 0) { bBirthdayFound = 1; //only set it if we're called from our CheckBirthdays service PopupNotifyBirthday(hContact, dtb, age); } else if (dab > 0) { PopupNotifyMissedBirthday(hContact, dab, age); } } if (bShouldCheckBirthdays) { if (dtb >= 0) { SoundNotifyBirthday(dtb); } } if ((bShouldCheckBirthdays) && (commonData.bUseDialog)) { if (dtb >= 0) { DialogNotifyBirthday(hContact, dtb, age); } else if (dab > 0) { DialogNotifyMissedBirthday(hContact, dab, age); } } if ((caps > 0) && (commonData.bUseClistIcon)) //TODO { if (dtb >= 0) { ClistIconNotifyBirthday(hContact, dtb, commonData.clistIcon); } } } else{ if (caps > 0) //TODO { //clear the icon ClearClistIcon(hContact, commonData.clistIcon); } } } return 0; }
int CSingleUser::OnRespone_ReqQryTrade(CTdxApi* pApi, RequestRespone_STRUCT* pRespone) { ReqQueryData_STRUCT* pQuery = (ReqQueryData_STRUCT*)pRespone->pContent; if (pRespone->pErr) { ErrorField* pField = (ErrorField*)m_msgQueue->new_block(sizeof(ErrorField)); pField->RawErrorID = pRespone->pErr->ErrCode; strcpy(pField->Text, pRespone->pErr->ErrInfo); strcpy(pField->Source, "OnRespone_ReqQryTrade"); m_msgQueue->Input_NoCopy(ResponeType::ResponeType_OnRtnError, m_msgQueue, m_pClass, 0, 0, pField, sizeof(ErrorField), nullptr, 0, nullptr, 0); } CJLB_STRUCT** ppRS = nullptr; CharTable2CJLB(pRespone->ppFieldInfo, pRespone->ppResults, &ppRS, pRespone->Client); // 操作前清空,按说之前已经清空过一次了 m_NewTradeList.clear(); if (ppRS) { // 利用成交编号的大小来判断正反序 if (!m_TradeListReverse) { int count = GetCountStructs((void**)ppRS); if (count > 1) { // 转成数字的比较,是否会有非数字的情况出现? long CJBH0 = atol(ppRS[0]->CJBH); long CJBH1 = atol(ppRS[count - 1]->CJBH); if (CJBH0 > CJBH1) { m_TradeListReverse = true; } } } int i = 0; while (ppRS[i]) { // 有部分券商,撤单也计成交了,真无语了,需要过滤 if (ppRS[i]->CJSL_ <= 0) { ++i; continue; } TradeField* pField = (TradeField*)m_msgQueue->new_block(sizeof(TradeField)); CJLB_2_TradeField(ppRS[i], pField); pField->Date = ppRS[i]->CJRQ_ == 0 ? Today(0) : ppRS[i]->CJRQ_;//日期为0,重新赋值 if (m_TradeListReverse) { // 华泰查出来的表后生成的排第一,所以要处理一下 m_NewTradeList.push_front(pField); } else { m_NewTradeList.push_back(pField); } ++i; } } // 新查出来的反而少了,华泰有合并成交的情况,这种如何处理? // 对同ID的需要累加,有发现累加不对应的,应当处理 // 同样条数的,也有可能其中的有变化,如何处理? bool bTryMerge = false; int OldTradeListCount = m_OldTradeList.size(); int NewTradeListCount = m_NewTradeList.size(); if (NewTradeListCount < OldTradeListCount) { // 行数变少了,应当是合并了 bTryMerge = true; } else if (OldTradeListCount == 0) { // 如果上一次的为空,不管这次查出来的是合并还是没有合并,都没有关系,当成没合并处理即可 } else if (NewTradeListCount == OldTradeListCount) { // 行数不变,但有可能是其中的一条部分成交的更新,所以检查一下 double OldQty = GetTradeListQty(m_OldTradeList, m_OldTradeList.size()); double NewQty = GetTradeListQty(m_NewTradeList, m_NewTradeList.size()); if (NewQty != OldQty) { // 同样长度成交量发生了变化,可能是合并的列表其中一个新成交了 bTryMerge = true; } } else { // 行数变多了,只要其中上次的部分有变化就需要检查一下 double OldQty = GetTradeListQty(m_OldTradeList, m_OldTradeList.size()); double NewQty = GetTradeListQty(m_NewTradeList, m_NewTradeList.size()); if (NewQty != OldQty) { bTryMerge = true; } } if (bTryMerge) { // 合并列表的处理方法 // 如果上次是合并,这次就没有必要再生成一次了 if (m_OldTradeMap.size() == 0 || !m_LastIsMerge) { for (unordered_map<string, TradeField*>::iterator it = m_OldTradeMap.begin(); it != m_OldTradeMap.end(); ++it) { TradeField* pField = it->second; delete[] pField; } m_OldTradeMap.clear(); TradeList2TradeMap(m_OldTradeList, m_OldTradeMap); } TradeList2TradeMap(m_NewTradeList, m_NewTradeMap); CompareTradeMapAndEmit(m_OldTradeMap, m_NewTradeMap); // 交换 for (unordered_map<string, TradeField*>::iterator it = m_OldTradeMap.begin(); it != m_OldTradeMap.end(); ++it) { TradeField* pField = it->second; delete[] pField; } m_OldTradeMap.clear(); m_OldTradeMap = m_NewTradeMap; m_NewTradeMap.clear(); m_LastIsMerge = true; } else { // 普通的处理方法 CompareTradeListAndEmit(m_OldTradeList, m_NewTradeList); m_LastIsMerge = false; } if (pQuery->bAll) { int i = 0; int count = m_NewTradeList.size(); for (list<TradeField*>::iterator it = m_NewTradeList.begin(); it != m_NewTradeList.end(); ++it) { TradeField* pField = *it; m_msgQueue->Input_Copy(ResponeType::ResponeType_OnRspQryTrade, m_msgQueue, m_pClass, i == count - 1, 0, pField, sizeof(TradeField), nullptr, 0, nullptr, 0); ++i; } } // 将老数据清理,防止内存泄漏 for (list<TradeField*>::iterator it = m_OldTradeList.begin(); it != m_OldTradeList.end(); ++it) { TradeField* pField = *it; m_msgQueue->delete_block(pField); } // 做交换 m_OldTradeList.clear(); m_OldTradeList = m_NewTradeList; m_NewTradeList.clear(); return 0; }
int CSingleUser::OnRespone_ReqQryOrder(CTdxApi* pApi, RequestRespone_STRUCT* pRespone) { ReqQueryData_STRUCT* pQuery = (ReqQueryData_STRUCT*)pRespone->pContent; if (pRespone->pErr) { ErrorField* pField = (ErrorField*)m_msgQueue->new_block(sizeof(ErrorField)); pField->RawErrorID = pRespone->pErr->ErrCode; strcpy(pField->Text, pRespone->pErr->ErrInfo); strcpy(pField->Source, "OnRespone_ReqQryOrder"); m_msgQueue->Input_NoCopy(ResponeType::ResponeType_OnRtnError, m_msgQueue, m_pClass, 0, 0, pField, sizeof(ErrorField), nullptr, 0, nullptr, 0); } WTLB_STRUCT** ppRS = nullptr; CharTable2WTLB(pRespone->ppFieldInfo, pRespone->ppResults, &ppRS, pRespone->Client); // 操作前清空,按说之前已经清空过一次了 m_NewOrderList.clear(); // 有未完成的,标记为true bool IsDone = true; // 有未申报的,标记为true bool IsNotSent = false; // 有更新的 bool IsUpdated = false; if (ppRS) { int i = 0; while (ppRS[i]) { // 将撤单委托过滤 if (ppRS[i]->MMBZ_ != MMBZ_Cancel && ppRS[i]->MMBZ_ != MMBZ_Buy_Cancel && ppRS[i]->MMBZ_ != MMBZ_Sell_Cancel) { // 需要将它输入到一个地方用于计算,这个是临时的,需要删除 OrderField* pField = (OrderField*)m_msgQueue->new_block(sizeof(OrderField)); WTLB_2_OrderField_0(ppRS[i], pField); CreateID(pField->ID, ppRS[i]->WTRQ, ppRS[i]->GDDM, ppRS[i]->WTBH); pField->Date = ppRS[i]->WTRQ_ == 0 ? Today(0) : ppRS[i]->WTRQ_;//日期为0,重新赋值 m_NewOrderList.push_back(pField); if (!ZTSM_IsDone(ppRS[i]->ZTSM_)) { IsDone = false; } if (ZTSM_IsNotSent(ppRS[i]->ZTSM_)) { IsNotSent = true; } // 需要将其保存起来,是只保存一次,还是每次都更新呢?个人认为只保存一次即可,反正是用来撤单的 unordered_map<string, WTLB_STRUCT*>::iterator it = m_pApi->m_id_api_order.find(pField->ID); if (it == m_pApi->m_id_api_order.end()) { WTLB_STRUCT* pWTField = (WTLB_STRUCT*)m_msgQueue->new_block(sizeof(WTLB_STRUCT)); memcpy(pWTField, ppRS[i], sizeof(WTLB_STRUCT)); m_pApi->m_id_api_order.insert(pair<string, WTLB_STRUCT*>(pField->ID, pWTField)); } } ++i; } } // 委托列表 // 1.新增的都需要输出 // 2.老的看是否有变化 ++m_OrderNotUpdateCount; int i = 0; list<OrderField*>::iterator it2 = m_OldOrderList.begin(); for (list<OrderField*>::iterator it = m_NewOrderList.begin(); it != m_NewOrderList.end(); ++it) { OrderField* pField = *it; bool bUpdate = false; if (i >= m_OldOrderList.size()) { bUpdate = true; } else { // 相同位置的部分 OrderField* pOldField = *it2; if (pOldField->LeavesQty != pField->LeavesQty || pOldField->Status != pField->Status) { bUpdate = true; } } if (bUpdate) { IsUpdated = true; m_OrderNotUpdateCount = 0; // 如果能找到下单时的委托,就修改后发出来 unordered_map<string, OrderField*>::iterator it = m_pApi->m_id_platform_order.find(pField->ID); if (it == m_pApi->m_id_platform_order.end()) { // 因为上次生成的可能在后期删了,所以要复制一份 OrderField* pField_ = (OrderField*)m_msgQueue->new_block(sizeof(OrderField)); memcpy(pField_, pField, sizeof(OrderField)); m_pApi->m_id_platform_order.insert(pair<string, OrderField*>(pField_->ID, pField_)); } else { OrderField* pField_ = it->second; memcpy(pField_, pField, sizeof(OrderField)); } m_msgQueue->Input_Copy(ResponeType::ResponeType_OnRtnOrder, m_msgQueue, m_pClass, 0, 0, pField, sizeof(OrderField), nullptr, 0, nullptr, 0); } // 前一个可能为空,移动到下一个时需要注意 if (it2 != m_OldOrderList.end()) { ++it2; } ++i; } if (pQuery->bAll) { int i = 0; int count = m_NewOrderList.size(); for (list<OrderField*>::iterator it = m_NewOrderList.begin(); it != m_NewOrderList.end(); ++it) { OrderField* pField = *it; m_msgQueue->Input_Copy(ResponeType::ResponeType_OnRspQryOrder, m_msgQueue, m_pClass, i == count - 1, 0, pField, sizeof(OrderField), nullptr, 0, nullptr, 0); ++i; } } // 将老数据清理,防止内存泄漏 for (list<OrderField*>::iterator it = m_OldOrderList.begin(); it != m_OldOrderList.end(); ++it) { OrderField* pField = *it; m_msgQueue->delete_block(pField); } // 做交换 m_OldOrderList.clear(); m_OldOrderList = m_NewOrderList; m_NewOrderList.clear(); double _queryTime = 0; if (!IsDone) { if (!IsUpdated) { // 没有更新,是否要慢点查 _queryTime = 0.5 * QUERY_TIME_MAX + QUERY_TIME_MIN; } // 有没有完成的,需要定时查询 if (IsNotSent) { // 有没申报的,是否没在交易时间?慢点查 _queryTime = 0.5 * QUERY_TIME_MAX + QUERY_TIME_MIN; } else { // 可能是交易时间了,是否需要考虑 _queryTime = 2 * QUERY_TIME_MIN; // 可能有些挂单一天都不会成交,挂在这一直导致查太多,加一下查询计数 if (m_OrderNotUpdateCount >= 3) { _queryTime = 0.5 * QUERY_TIME_MAX + QUERY_TIME_MIN; } } } else { // 全完成了,可以不查或慢查 _queryTime = 5 * QUERY_TIME_MAX; } m_QueryOrderTime = time(nullptr) + _queryTime; OutputQueryTime(m_QueryOrderTime, _queryTime, "NextQueryOrder_QueryOrder"); // 决定成交查询间隔 if (IsUpdated) { // 委托可能是撤单,也有可能是成交了,赶紧查一下 _queryTime = 0; m_QueryTradeTime = time(nullptr) + _queryTime; OutputQueryTime(m_QueryTradeTime, _queryTime, "NextQueryTrade_QueryOrder"); } else { // 委托没有变化,那成交就没有必要查那么快了 _queryTime = 5 * QUERY_TIME_MAX; m_QueryTradeTime = time(nullptr) + _queryTime; OutputQueryTime(m_QueryTradeTime, _queryTime, "NextQueryTrade_QueryOrder"); } return 0; }
//--------------------------------------------------------------------------- __fastcall TEAddForm::TEAddForm(TComponent* Owner) : TForm(Owner) { DateTimePicker1->Date=Today(); // Установка у DateTimePicker'a текущей даты. }
double ForwardRate::FwdRate(const Utilities::Date::MyDate &start, const Utilities::Date::MyDate &end) const { return FwdRate(start.Diff(Today()), end.Diff(Today())); }