1

Windows GetDateFormat API関数を使用して日付をフォーマットしようとしています:

nResult = GetDateFormat(
      localeId,   //0x409 for en-US, or LOCALE_USER_DEFAULT if you're not testing
      0,          //flags
      dt,         //a SYSTEMTIME structure
      "M/d/yyyy", //the format we require
      null,       //the output buffer to contain string (null for now while we get the length)
      0);         //the length of the output buffer (zero while we get the length)

次に、日付/時刻を渡します。

SYSTEMTIME dt;
dt.wYear = 1600;
dt.wMonth = 12;
dt.wDay = 31;

この場合、nResult はゼロを返します。

成功しなかった場合、関数は 0 を返します。拡張エラー情報を取得するために、アプリケーションは GetLastError を呼び出し、次のエラー コードのいずれかを返すことができます。

  • ERROR_INSUFFICIENT_BUFFER。指定されたバッファ サイズが十分に大きくないか、誤って NULL に設定されました。
  • ERROR_INVALID_FLAGS。フラグに指定された値が無効でした。
  • ERROR_INVALID_PARAMETER。パラメータ値のいずれかが無効でした。

ただし、1 日後の日付を返す場合:

SYSTEMTIME dt;
dt.wYear = 1601;
dt.wMonth = 1;
dt.wDay = 1;

その後、動作します。

私は何を間違っていますか?日付をフォーマットするにはどうすればよいですか?

例:キリストの生年月日:

12/25/0000

または宇宙が始まった日付

-10/22/4004 6:00 PM

またはカエサルが亡くなった日:

-3/15/44

ボーナスリーディング

4

2 に答える 2

2

これは実際にはSystemTimeの制限です。

...year/month/day/hour/minute/second/milliseconds value since 1 January 1601 00:00:00 UT... to 31 December 30827 23:59:59.999

この制限を回避する方法を調べるのにしばらく時間を費やしましたが、GetDateFormat()時間がかかるため、SystemTimeおそらく弾丸を噛んで独自のformat()メソッドを作成する必要があります。

于 2012-09-11T19:31:13.987 に答える
1

SYSTEMTIME構造体は、1601 年から 30827 年までのみ有効です。これは、Windows マシンでは、1.1.1601 00:00 から経過した間隔からシステム時間がカウントされるためです。ウィキペディアの記事を参照して ください。

于 2012-09-11T19:25:57.270 に答える