C# 如何在给定UTC时间和日期的情况下创建DateTime对象?
我已经有UTC格式的日期和时间字符串。我需要使用这些字符串来创建DateTime对象 这是我正在使用的代码。问题是时间被转换,datetime对象上的我的UTC时间不再正确。我给出了UTC值,这样它们就不会再被转换了C# 如何在给定UTC时间和日期的情况下创建DateTime对象?,c#,.net-4.5.2,C#,.net 4.5.2,我已经有UTC格式的日期和时间字符串。我需要使用这些字符串来创建DateTime对象 这是我正在使用的代码。问题是时间被转换,datetime对象上的我的UTC时间不再正确。我给出了UTC值,这样它们就不会再被转换了 string format = $"{dateFormat}_{timeFormat}"; string value = $"{dateValue}_{timeValue}"; var x = DateTimeOffset.ParseExact(value, format, Cu
string format = $"{dateFormat}_{timeFormat}";
string value = $"{dateValue}_{timeValue}";
var x = DateTimeOffset.ParseExact(value, format, CultureInfo.CurrentCulture).UtcDateTime;
其中dateFormat=“ddMMyy”
,timeFormat=“HHmmss”
,dateValue=“191194”
和timeValue=“225446”
使用具有以下值的重载:
请注意,对
UtcDateTime
的调用没有任何影响,但是时间已经是UTC时间(这是您想要的),因此它将返回等效的DateTime
值。你可以按照Jon的建议使用DateTime.ParseExact
,它具有相同的重载。D Stanley的答案当然有效,但比你需要的稍微复杂一些-如果你想要一个DateTime
,你根本不需要使用DateTimeOffset
,asDateTime.ParseExact
处理DateTimeStyles.AssumeUniversal
,尽管您需要指定AdjustToUniversal
,以便结果以UTC为单位。(否则,它会自动调整到本地时区——在我看来,这毫无帮助,但这是另一天的战斗。)
示例代码(向我揭示了对datetimestyle.AdjustToUniversal
的需要):
顺便说一句,我会小心使用CultureInfo.CurrentCulture
,因为它会影响正在使用的日历系统以及格式字符串等
(当然,作为旁注,我建议使用我的库。在这种情况下,我可能建议使用
LocalTimeFormat
解析您的时间,使用LocalDateFormat
解析您的日期,然后将结果加在一起,得到LocalDateTime
,然后使用UTC将其转换为ZonedDateTime
。或者当然,您可以使用现有方法创建ZonedDateTimePattern
或InstantPattern
。如果您的日期不是一个字符串,此解决方案也会很有帮助。
只需使用DateTimeKind.Utc
作为DateTime
的构造函数参数:
new DateTime(2020, 05, 07, 18, 33, 0, DateTimeKind.Utc);
这里的问题是,默认情况下,DateTimeOffset对象将偏移为系统时区偏移量。因此,如果运行代码的计算机是UTC-4,那么.UtcDateTime将是+4小时的值。很好,Jon Skeet,shill代表Noda Time。如果您在上面的代码中只使用
.DateTime
,您将得到一种未指定…所以您确实需要UtcDateTime或其他技巧。
var x = DateTime.ParseExact(
value,
format,
CultureInfo.CurrentCulture,
DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal);
using System;
using System.Globalization;
class Test
{
static void Main(string[] args)
{
string text = "2015-06-10 20:52:13";
string format = "yyyy-MM-dd HH:mm:ss";
var dateTime = DateTime.ParseExact(
text,
format,
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal);
Console.WriteLine(dateTime); // 10/06/2015 20:52:13 on my box
Console.WriteLine(dateTime.Kind); // Utc
}
}
new DateTime(2020, 05, 07, 18, 33, 0, DateTimeKind.Utc);