//--------------------------------------------------------------------- // [概要] // VBの日付を"yyyy/mm/dd hh:nn:ss"文字列で返す // [引数] // vbDate 日付型(Date型)の日付 // [戻り値] // 文字列型(String型)に変換した日付 // [機能説明] // 文字列型(String)を戻す関数の例 // VBでの定義 // Declare Function VbDate2String(ByVal vbDate As Date) As String //--------------------------------------------------------------------- __declspec(dllexport) BSTR __stdcall VbDate2String(DATE vbDate) { UDATE udate; u_long dwFlags = 0; memset(&udate, 0, sizeof(udate)); // VBの日付型(Date)をUDATE構造体に変換する HRESULT hres = VarUdateFromDate(vbDate, dwFlags, &udate); if (hres != S_OK) { return NULL; } char temp[64]; int len = wsprintf(temp, "%04d/%02d/%02d %02d:%02d:%02d", udate.st.wYear, udate.st.wMonth, udate.st.wDay, udate.st.wHour, udate.st.wMinute, udate.st.wSecond); // return SysAllocString(temp);でいけそうな気がするが、 // SysAllocString, SysAllocStringLen, SysReAllocString, SysReAllocStringLen // 上記4つの関数は、VBに制御がわたったとき、正常に処理できない。 // おそらく、文字コードの自動変換(Unicode->Ascii->Unicode)の関係でよろしくないと // 思われり。唯一正常に動くSysAllocStringByteLenを使用。 return SysAllocStringByteLen(temp, len); }
//--------------------------------------------------------------------- // [概要] // VBの日付を"yyyy/mm/dd" "hh:nn:ss"二つの文字列で返す。 // [引数] // vbDate 日付型(Date型)の日付 // [戻り値] // 0: 正常終了 // -1: 異常終了(変換失敗) // [機能説明] // 文字列型(String)を書き換える例 // VBでの定義 // Declare Function VbDate2String2(ByVal vbDate As Date, // ByVal strYMD As String, ByVal strHMS As String) As Long //--------------------------------------------------------------------- __declspec(dllexport) long __stdcall VbDate2String2(DATE vbDate, BSTR* ymd, BSTR* hms) { UDATE udate; u_long dwFlags = 0; memset(&udate, 0, sizeof(udate)); // VBの日付型(Date)をUDATE構造体に変換する HRESULT hres = VarUdateFromDate(vbDate, dwFlags, &udate); if (hres != S_OK) { return -1; } // SysReSysAllocString(temp);でいけそうな気がするが、 // SysAllocString, SysAllocStringLen, SysReAllocString, SysReAllocStringLen // 上記4つの関数は、VBに制御がわたったとき、正常に処理できない。 // おそらく、文字コードの自動変換(Unicode->Ascii->Unicode)の関係でよろしくないと // 思われり。唯一正常に動くSysAllocStringByteLenを使用するため、 // SysFreeString()してからSysAllocStringByteLen()で再確保する char temp[64]; int len = wsprintf(temp, "%04d/%02d/%02d", udate.st.wYear, udate.st.wMonth, udate.st.wDay); SysFreeString(*ymd); *ymd = SysAllocStringByteLen(temp, len); len = wsprintf(temp, "%02d:%02d:%02d", udate.st.wHour, udate.st.wMinute, udate.st.wSecond); SysFreeString(*hms); *hms = SysAllocStringByteLen(temp, len); return 0; }
CString FormatDateTime ( COleDateTime &DateTime, LPCTSTR pFormat ) { // If null, return empty string if ( DateTime.GetStatus() == COleDateTime::null || DateTime.GetStatus() == COleDateTime::invalid ) return _T(""); UDATE ud; if (S_OK != VarUdateFromDate(DateTime.m_dt, 0, &ud)) { return _T(""); } TCHAR *weeks[]={_T("Sun"),_T("Mon"),_T("Tue"),_T("Wen"),_T("Thu"),_T("Fri"),_T("Sat")}; TCHAR *month[]={_T("JAN"),_T("FEB"),_T("MAR"),_T("APR"), _T("MAY"),_T("JUN"),_T("JUL"),_T("AUG"), _T("SEP"),_T("OCT"),_T("NOV"),_T("DEC")}; TIME_ZONE_INFORMATION stTimeZone; GetTimeZoneInformation(&stTimeZone); CString strDate; strDate.Format(_T("%s, %d %s %02d %d:%d:%d %c%04d") ,weeks[ud.st.wDayOfWeek], ud.st.wDay,month[ud.st.wMonth-1],ud.st.wYear%100,ud.st.wHour, ud.st.wMinute,ud.st.wSecond, stTimeZone.Bias>0?_T('-'):_T('+'), abs(stTimeZone.Bias*10/6) ); return strDate; }
//--------------------------------------------------------------------- // [概要] // VBの日付をDOSの日付に変換 // [引数] // vbDate 日付型(Date型)の日付 // [戻り値] // DOSDATETIME型(u_longのビットフィールド)に変換した値 // [機能説明] // VBのDate型を引数で受け取る例 // VBでの定義 // Declare Function VbDate2DosDate(ByVal vbDate As Date) As Long //--------------------------------------------------------------------- __declspec(dllexport) long __stdcall VbDate2DosDate(DATE vbDate) { UDATE udate; u_long dwFlags = 0; memset(&udate, 0, sizeof(udate)); // VBの日付型(Date)をUDATE構造体に変換する HRESULT hres = VarUdateFromDate(vbDate, dwFlags, &udate); if (hres != S_OK) { return 0xffffffff; } return ((udate.st.wYear - 1980) << 25) | (udate.st.wMonth << 21) | (udate.st.wDay << 16) | (udate.st.wHour << 11) | (udate.st.wMinute << 5) | (udate.st.wSecond / 2); }