Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在给定UTC时间和日期的情况下创建DateTime对象?_C#_.net 4.5.2 - Fatal编程技术网

C# 如何在给定UTC时间和日期的情况下创建DateTime对象?

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

我已经有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”

使用具有以下值的重载:


请注意,对
UtcDateTime
的调用没有任何影响,但是时间已经是UTC时间(这是您想要的),因此它将返回等效的
DateTime
值。你可以按照Jon的建议使用
DateTime.ParseExact
,它具有相同的重载。

D Stanley的答案当然有效,但比你需要的稍微复杂一些-如果你想要一个
DateTime
,你根本不需要使用
DateTimeOffset
,as
DateTime.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);