尝试使用 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);
}
}
我一直在学习如何使用 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);
}
}