尝试使用 ZonedDateTimePattern 从字符串解析 ZonedDateTime 失败

Getting a Fail Trying to Parse a ZonedDateTime from a String Using ZonedDateTimePattern

我一直在学习如何使用 NodaTime,因为我认为它是一个比 BCL 中的少数结构优越得多的“万物时态”库。阅读文档并进行试验。

这个实验让我很困惑。我开始只是试图解析 ZonedDateTime。 我尝试的事情没有成功,所以我想我会尝试一些应该“防弹”的东西。以下代码表示该尝试:

Instant thisNow = SystemClock.Instance.GetCurrentInstant();
var timezone = DateTimeZoneProviders.Tzdb["Australia/Brisbane"];

var zonedDateTime = thisNow.InZone(timezone);

var zonePattern = ZonedDateTimePattern.GeneralFormatOnlyIso;

var zoneFormatted = zonePattern.Format(zonedDateTime);

var zoneParseResult = zonePattern.Parse(zoneFormatted);

Console.WriteLine(zoneParseResult.Success ? "parse success" : "parse failure");

因此,只需尝试将刚刚转换为字符串的内容解析回来。

zoneFormatted的值如下2021-09-04T16:59:08 Australia/Brisbane (+10)

知道我做错了什么吗?
干杯

Any ideas what I am doing wrong?

您正在使用 ZonedDateTimePattern.GeneralFormatOnlyIso,它(顾名思义)仅用于格式化,而不用于解析。

要获得能够解析时区的模式,您需要指定一个 IDateTimeZoneProvider。最简单的方法是从仅格式模式开始,并使用 WithZoneProvider:

using NodaTime;
using NodaTime.Text;
using System;

class Program
{
    static void Main(string[] args)
    {
        var pattern = ZonedDateTimePattern.GeneralFormatOnlyIso
            .WithZoneProvider(DateTimeZoneProviders.Tzdb);
        var text = "2021-09-04T16:59:08 Australia/Brisbane (+10)";
        var result = pattern.Parse(text);
        Console.WriteLine(result.Success);
        Console.WriteLine(result.Value);
    }
}