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

时间:2015-10-06 19:41:08

标签: c# .net-4.5.2

我已经有UTC的日期和时间字符串。我需要使用这些字符串来创建DateTime对象。

这是我正在使用的代码。问题是转换时间并且我在datetime对象上的UTC时间不再正确。我给出了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".

2 个答案:

答案 0 :(得分:6)

斯坦利的答案肯定有效,但比你需要的稍微复杂一点 - 如果你想要 DateTime作为结果,你不需要使用DateTimeOffset完全相同,因为DateTime.ParseExact也处理DateTimeStyles.AssumeUniversal,但您需要指定AdjustToUniversal,以便结果采用UTC格式。 (否则它会自动调整到当地时区 - 并且无益于IMO,但那是另一天的战斗。)

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解析您的时间,使用{{ {1}},然后将结果添加到一起以获得LocalDateFormat,然后您可以使用UTC将其转换为LocalDateTime。或者您可以使用现有方法创建当然,ZonedDateTimeZonedDateTimePattern。)

答案 1 :(得分:4)

使用DateTimeOffset.ParseExact值的重载DateTimeStyles

var x = DateTimeOffset.ParseExact(value, 
                                  format, 
                                  CultureInfo.CurrentCulture,  
                                  DateTimeStyles.AssumeUniversal)
                      .UtcDateTime;

请注意,对UtcDateTime的调用不会伤害任何内容,但已经已经时间(这是你想要的) )所以它会返回相应的DateTime值。您可以像Jon建议的那样使用DateTime.ParseExact,它具有相同的重载。