c# NodaTime - 读取 ISO 字符串作为 EST 时间

c# NodaTime - Read ISO String as EST time

假设有一个 table,其日期时间列表示为 ISO 字符串。日期时间数据最初在 EST 中表示为 NodaTime ZonedDateTime 格式。然后将其转换为字符串格式 2021-02-10T02:07:07.000 -05 例如:

// datetime data represented as ZonedDateTime
var dateTimeUtc = new DateTime(2021, 2, 10, ,7, 7, 7, DateTimeKind.Utc);
var instant = Instant.FromDateTimeUtc(dateTimeUtc);
var zonedDateTime = instant.InZoneNewYork();

// convert datetime value to ISO string
var IsoString = zonedDateTime.Value.ToString("yyyy-MM-ddTHH:mm:ss;fff +o<HH>", CultureInfo.InvariantCulture);

现在我需要从 table 中检索此值并以 ZonedDateTime EST 格式表示它。 如果我想从这个 table 中得到这个值,我可以这样做:

var parsePattern = ZonedDateTimePattern.CreateWithInvariantCulture("yyyy-MM-ddTHH:mm:ss;fff +O<HH>", DateTimeZoneProviders.Tzdb);

然而,返回的字符串表示为 UTC 时间 2021-02-10T02:07:07 UTC (+00),这是不准确的(实际保存的值为 EST)。

有没有办法使用 NodaTime 读取指定时区的 ISO 字符串?

Is there a way I can read ISO string with a specified time zone using NodaTime?

更改 ZonedDateTime Iso 字符串表示的格式,并为两个转换操作保留该格式应该会有所帮助。

"yyyy-MM-ddTHH:mm:ss;fff +O<HH>" 更改为 ZonedDateTimePattern.GeneralFormatOnlyIso.PatternText 如:

var dateTimeUtc = new DateTime(2021, 2, 10, 7, 7, 7, DateTimeKind.Utc);
var instant = Instant.FromDateTimeUtc(dateTimeUtc);

DateTimeZone ny = DateTimeZoneProviders.Tzdb["America/New_York"];
var zonedDateTime = instant.InZone(ny);

// convert datetime value to ISO string


var IsoString = zonedDateTime.ToString(ZonedDateTimePattern.GeneralFormatOnlyIso.PatternText,
                       CultureInfo.InvariantCulture);


//parse iso string, like "2021-02-10T02:07:07 America/New_York (-05)"

var parsePattern = ZonedDateTimePattern.CreateWithInvariantCulture(
                      ZonedDateTimePattern.GeneralFormatOnlyIso.PatternText, 
                      DateTimeZoneProviders.Tzdb);
var date2 = parsePattern.Parse("2021-02-10T02:07:07 America/New_York (-05)").Value;