如何创建给定UTC时间和日期的DateTime对象?
本文关键字:日期 时间 DateTime 对象 UTC 何创建 创建 | 更新日期: 2023-09-27 18:16:23
我已经有UTC格式的日期和时间字符串了。我需要使用这些字符串来创建一个DateTime对象。
这是我正在使用的代码。问题是时间被转换,我的UTC时间在datetime对象上不再正确。我给出的是UTC值,所以它们不会再次被转换。
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".
D Stanley的答案当然有效,但比你需要的稍微复杂一点-如果你想要一个DateTime
作为结果,你根本不需要使用DateTimeOffset
,因为DateTime.ParseExact
也处理DateTimeStyles.AssumeUniversal
,尽管你需要指定AdjustToUniversal
以便结果是在UTC。(否则,它会自动调整到当地时区——在我看来,这是无益的,但这是另一天的战斗。)
var x = DateTime.ParseExact(
value,
format,
CultureInfo.CurrentCulture,
DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal);
示例代码(向我揭示了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
}
}
我要小心使用CultureInfo.CurrentCulture
,顺便说一下,请记住它会影响使用中的日历系统以及格式字符串等。
(当然,作为旁注,我建议使用我的Noda Time库。在这种情况下,我可能会建议使用LocalTimeFormat
分析您的时间,使用LocalDateFormat
分析您的日期,然后将结果加在一起以获得LocalDateTime
,然后您可以使用UTC转换为ZonedDateTime
。或者您可以使用您现有的方法来创建ZonedDateTimePattern
或InstantPattern
,当然)
如果你的日期不是一个字符串,这个解决方案也会很有用。只使用DateTimeKind.Utc
作为DateTime
的构造函数参数:
new DateTime(2020, 05, 07, 18, 33, 0, DateTimeKind.Utc);
使用一个DateTimeStyles
值的DateTimeOffset.ParseExact
重载:
var x = DateTimeOffset.ParseExact(value,
format,
CultureInfo.CurrentCulture,
DateTimeStyles.AssumeUniversal)
.UtcDateTime;
请注意,对UtcDateTime
的调用不会影响任何内容,但时间已经是UTC时间(这是您想要的),因此它将返回等效的DateTime
值。您可以像Jon建议的那样使用DateTime.ParseExact
,它具有相同的过载。