3

私は多くの SO 記事を読みましたが、問題に対する適切な答えを見つけることができないようです。投稿された提案には、日付を文字列との間で複数回変換し、最後にビットを連結する関数が含まれており、すべてが面倒なようです...

だから問題に:

世界中にサーバーがあります。すべてのサーバーは独自のローカル時間で実行され、サーバーに対してローカルな時間エントリを含むログを保持します。一部のサーバーは DST 観測エリアにあり、他のサーバーはそうではありません

ログからこれらの文字列があるとします: 2013-01-01 12:34:56, 2013-07-01 12:34:56 そして、このサーバーがニューヨークにあることを知っているので、UTC-5 または UTC-4 の場合DST が実行中です

そして、DST が適用されず、タイム ゾーンが +8 である香港のサーバーのログから同じ文字列を取得しました。

私が求めているのは、それを伝えることができるコードのブロックです:

  • これは時間を表す文字列です
  • 文字列のタイムゾーンは次のとおりです
  • 必要に応じて夏時間も適用する必要があります

コードは文字列を解析して DateTimeOffset に変換し、解析対象の時間が DST に関連している場合は、DST に従ってオフセットが調整されます。

例: NY サーバーのログには " 2013-01-01 ..."と表示されています。DST は 1 月のこの日付には適用されないため、解析される日付は次のようになります: ニューヨーク時間で 12:34:56、別名 17:34:56 UTC (-5 であるため、DST はありません)

ニューヨークのサーバー ログには、「2013-07-01 ...」と記載されています。夏時間は 6 月のこの日付に適用されるため、解析される日付は次のようになります。ニューヨーク時間で 12:34:56、UTC で16:34:56 -4、DST あり)

HK サーバー、両方の日時が 04:34:56 UTC に解析されます

みんなありがとう

4

2 に答える 2

6

まず、どこでも UTC でログインするようにシステムを変更することを強くお勧めします。それはあなたの人生をよりシンプルにします。

持っているものに本当に行き詰まっている場合は、 a を 0 (デフォルト) で使用する必要がありDateTime.TryParseExactますDateTimeStylesDateTimeKindこれにより、 ofの値が得られますUnspecified。これは、必要なものです。(UTC ではなく、解析を行うマシンに対してローカルではありません。)

次に、TimeZoneInfo.GetUtcOffset(そのログの適切なタイム ゾーンを使用して) を使用してオフセットを計算DateTimeOffsetし、2 つから一緒に を作成できます。

完全に偏見はさておき、私が管理しているNoda Timeプロジェクトを使用するように変更することもできます。これにより、コードをより理解しやすくなります :)

于 2013-02-06T18:26:54.693 に答える
5

異なるログ ファイルに記録された時刻の UTC 時刻を取得するには、ローカル タイム ゾーンの名前を知る必要があります。次に、DateTimeOffset-struct -class TimeZoneInfo使用して UTC 時間を計算できます。

public DateTime ParseAsUtc(string logDate, string timezoneName)
{
    var timeZone = TimeZoneInfo.FindSystemTimeZoneById(timezoneName);
    var localDate = DateTime.Parse(logDate);
    var offset = new DateTimeOffset(localDate, timeZone.GetUtcOffset(localDate));
    return offset.ToUniversalTime().DateTime;
}

ParseAsUtc("2013-01-01 12:34:56", "Eastern Standard Time"); //01.01.2013 17:34:56
ParseAsUtc("2013-07-01 12:34:56", "Eastern Standard Time"); //01.07.2013 16:34:56
ParseAsUtc("2013-01-01 12:34:56", "China Standard Time");   //01.01.2013 04:34:56
ParseAsUtc("2013-01-01 12:34:56", "China Standard Time");   //01.07.2013 04:34:56
于 2013-02-06T19:02:43.740 に答える