16

ファイルから一部のデータを処理する C++/CX アプリがあります。日付を保存するために使用されたカルチャを表す文字列がそこにあり、いくつかの日付があります。それらを文字列から Platform::DateTime に変換する必要があります。Windows::Globalization::DateTimeFormattingが使用するクラスだと聞いたことがあり ますが、それを使用する方法がわかりません。誰にも例がありますか?

4

3 に答える 3

14

WinRT の C++/CX プロジェクションは、マネージ (C#/VB) プロジェクションとは多くの点で異なります。最も重要なものの 1 つは、基本型 (、、、、など)PointSizeプロジェクションStringですDateTime

マネージド プロジェクションはこれらの型を .NET 型として (BCL のすべての基になるサポートを使用して) 投影しますが、C++ プロジェクションは通常、相互運用のためにこれらの型を最小限に投影し、ユーザーがより高度な機能について C++ ライブラリ サポートに依存することを期待します。

したがって、.NET では符号付き 32 ビット整数がSystem.Int32(関連する.Parse機能と共に) になるのに対して、C++ では通常の C++ を取得し、intCRT 機能 ( _wtoi) を使用して同様のタスクを実行することが期待されます。この違いはしばしば、異なるプロジェクション間に「機能のギャップ」をもたらします。そのうちの 1 つは、DateTime構造 (BCL で非常に豊富にサポートされている) を処理することです。

私が得た解決策は、COleDateTimeクラス(ATLComTime.hをインクルードすることで見つかりました)から始めて、 COleDateTime-> SYSTEMTIME-> FILETIME-> _ULARGE_INTEGER-> Windows::Foundation::DateTime. これは真面目な体操ですが、COleDateTimeクラスには必要な言語固有の解析機能があります。

LCID lcid = LocaleNameToLCID(L"es-es", LOCALE_ALLOW_NEUTRAL_NAMES); //parse language tag to get locale ID

COleDateTime dt;
dt.ParseDateTime(L"12 enero, 2012 10:00:01", 0, lcid); //parse date string based on language

//get system time struct
SYSTEMTIME st;
dt.GetAsSystemTime(st);

//COleDateTime is in local timezone, DateTime is in UTC, so we need to convert
SYSTEMTIME st_utc;
TzSpecificLocalTimeToSystemTime(nullptr, &st, &st_utc);

//get filetime struct to get a time format compatible with DateTime
FILETIME ft;
SystemTimeToFileTime(&st_utc, &ft);

//use _ULARGE_INTEGER to get a uint64 to set the DateTime struct to
_ULARGE_INTEGER ulint = {ft.dwLowDateTime, ft.dwHighDateTime};

Windows::Foundation::DateTime wfdt;
wfdt.UniversalTime = ulint.QuadPart;

DateTimeFormatterクラスについていろいろ尋ねましたが、ドキュメントが正しくありません。解析をサポートしておらず、意図していません (フォーマットのみ)。

于 2012-07-23T22:05:51.193 に答える
4

トリックをしますかstd::get_time?ページの下部にある例は、ロケールを使用して日付文字列を構造体に解析できることを示していますtmtmその後、構造体を正しい WinRT に変換できると思いますDateTime

于 2012-07-26T11:53:09.727 に答える
0

私はこのコードを使用します:

auto cal = ref new Windows::Globalization::Calendar(); cal->AddSeconds(additionalSeconds); return cal->GetDateTime();

Windows::Globalization::Calendar を使用すると、必要な便利な機能をすべて利用できます: https://msdn.microsoft.com/library/windows/apps/br206724

于 2016-03-15T07:26:33.400 に答える