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;
假设有一个 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;