我们的应用程序与一个API交互,该API返回格式为yyyyMMdd HH:mm
的本地日期时间字符串,其中第二个数字字段指示UTC偏移量(以小时为单位)。
我们用下面的代码成功地处理了这个问题。
DateTimeOffset ParseWeirdDateTime(string dateTimeString, double utcOffset)
{
DateTimeOffset dateTimeOffset = DateTimeOffset.ParseExact(
dateTimeString,
"yyyyMMdd HH:mm",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal
);
return dateTimeOffset.AddHours(-utcOffset).ToOffset(TimeSpan.FromHours(utcOffset));
}
string localDateTimeString = "20231108 14:30";
double utcOffset = -4;
DateTimeOffset dateTimeParsed = ParseWeirdDateTime(localDateTimeString, utcOffset);
// comes out to 11/8/2023 2:30:00 PM -04:00
字符串
我的问题是,有没有更好的方法来处理这个问题?虽然这很有效,但解析为UTC DateTimeOffset感觉很笨拙,只是应用偏移量的倒数,最后转换为偏移量。
1条答案
按热度按时间x8goxv8g1#
yyyyMMdd HH:mm
输入字符串代表一个“本地”(或者更确切地说:非UTC)时刻,但是.Date+Time+Offset
元组,您也在使用DateTimeOffset.ParseExact
:字符串只表示Date+Time+Undefined-Offset
元组。DateTime.ParseExact
,并确保它有DateTimeKind.Unspecified
(因为此时没有指定偏移数据)。DateTimeKind.Local
:它专门指 * 本地计算机的时间 *,这在商业应用程序中几乎总是无用的,因为它不像真实的UTC那样是不变的:考虑本地时区,政治时区变化,夏令时,机器错误配置等)。DateTimeStyles.AssumeUniversal
,这在这里不适用,因为您传入的字符串并不表示UTC值。正如the documentation所述“* 如果解析的字符串中没有指定时区,则假定该字符串表示UTC *”。我会这样做:
dateTimeString
值仅表示日期+时间值 * 而没有偏移量 *,因此我使用DateTime.ParseExact
而不是DateTimeOffset.ParseExact
。DateTimeStyles.None
作为AssumeUniversal
是不正确的。DateTime
的值 * 调整为 * aDateTimeOffset
。字符串