1

Noda Time でユーザー入力を解析しようとしています。

入力:

  • 形式の日付YYYY-MM-DD
  • 時間
  • tz データベースのタイム ゾーン名 (Google のタイム ゾーン API から返されます)

このデータを、同じく tz データベースのタイム ゾーン名に基づいて、UTC および他のタイム ゾーンに変換する必要があります。

現在、私はLocalDateTimeとのZonedDateTime違いを理解しようとしていますが、(できれば) これを理解する前に、誰かがこれを行う方法を示すことができるでしょう。

4

2 に答える 2

1

http://msmvps.com/blogs/jon_skeet/archive/2012/02.aspxには優れた情報があり、少し古くなっていますが、公式ドキュメントで関連するメソッド名を簡単に見つけることができます。

以下はいくつかのデモンストレーションコードです。

string date = "2013-01-22";
string hour = "13";
string minute = "15";

var result = LocalDateTimePattern.ExtendedIsoPattern.Parse(date + "T" + hour + ":" + minute + ":00");

if (result.Success == true)
{
    DateTimeZone source_zone = DateTimeZoneProviders.Tzdb.GetZoneOrNull("Europe/Brussels");
    DateTimeZone target_zone = DateTimeZoneProviders.Tzdb.GetZoneOrNull("Australia/Melbourne");

    if (source_zone != null && target_zone != null)
    {
        ZonedDateTime source_zoned_dt = result.Value.InZoneStrictly(source_zone);

        Console.WriteLine(source_zoned_dt.ToInstant());
        Console.WriteLine(source_zoned_dt);
        Console.WriteLine(source_zoned_dt.WithZone(target_zone));
    }
    else
    {
        Console.WriteLine("time zone not found");
    }
}
else
{
    Console.WriteLine("parsing failed");
}
于 2013-01-22T13:23:07.127 に答える
1

あなたの答えは私がすることにかなり近いですが、日付、時間、分が別々の文字列になっている場合は、次を使用します。

var zoneProvider = DateTimeZoneProviders.Tzdb;
var sourceZone = zoneProvider.GetZoneOrNull("Europe/Brussels");
var targetZone = zoneProvider.GetZoneOrNull("Australia/Melbourne");

if (sourceZone == null || targetZone == null)
{
    Console.WriteLine("Time zone not found");
    return;
}

var dateParseResult = LocalDatePattern.IsoPattern.Parse(date);
int hourValue, minuteValue;
if (!dateParseResult.Success ||
    !int.TryParse(hour, out hourValue) ||
    !int.TryParse(minute, out minuteValue))
{
    Console.WriteLine("Parsing failed");
    return;       
}

var localDateTime = dateParseResult.Value + new LocalTime(hour, minute);
var zonedDateTime = localDateTime.InZoneStrictly(sourceZone);
Console.WriteLine(zonedDateTime.ToInstant());
Console.WriteLine(zonedDateTime);
Console.WriteLine(zonedDateTime.WithZone(targetZone));

ここでの唯一の重要な違いは解析です。すべてのビットをくっつけるつもりはありません。文字列を個別に解析するだけです。(私はまた、失敗のために「早期アウト」を好みます:)

InZoneStrictly入力されたローカル日付/時刻があいまいな場合、間違いなく失敗しますか?の意味に注意する必要があります。

于 2013-01-24T23:00:21.603 に答える