如何创建给定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".

如何创建给定UTC时间和日期的DateTime对象?

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。或者您可以使用您现有的方法来创建ZonedDateTimePatternInstantPattern,当然)

如果你的日期不是一个字符串,这个解决方案也会很有用。只使用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,它具有相同的过载。