Exemple #1
0
//---------------------------------------------------------------------
// [概要]
//   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);
}
Exemple #2
0
//---------------------------------------------------------------------
// [概要]
//   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;
}
Exemple #3
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;
}
Exemple #4
0
//---------------------------------------------------------------------
// [概要]
//   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);
}