如何从文件中解析日期并添加时区信息

时间:2019-10-14 07:40:08

标签: c# datetime

我需要解析一个包含时间戳的文件,例如:“ 09.06.2019 00:00:00”。提供这些文件的人告诉我,这些时间戳位于UTC + 1(无DST)的“ CET”时区中。如何将时间戳解析为相应的DateTime对象?到目前为止,我想到的唯一可能的解决方案是将它们解析为UTC,然后将其手动添加到DateTime对象1小时,但这真的是一个很好的选择吗?

非常感谢!

3 个答案:

答案 0 :(得分:1)

帮自己一个忙[strong]未来,并在处理时区时使用DateTimeOffset(而不是DateTime)。

Microsoft a whole article解释了与日期/时间相关的不同结构。

就解析为TimeZoneOffset而言,有几种不同的方法,但最直接的方法是仅使用ParseExact()TryParseExact()

var dateStr =  "09.06.2019 00:00:00";

var success = DateTimeOffset.TryParseExact(
        dateStr + " +01:00", // Append the desired timezone to the string
        "dd.MM.yyyy HH:mm:ss zzz", // The format to parse, including Timezone in the end
        null, 
        DateTimeStyles.None, // Strict style. You can also specify how tolerant it is to whitespace
        out DateTimeOffset result // Store it in new variable
    );

if (success)
{
    // Manipulate into DateTime of different zones.
    Debug.WriteLine(result.DateTime);       // 12am of 09 June 2019
    Debug.WriteLine(result.UtcDateTime);    // 11am the previous day, because result is in UTC+1 timezone
    Debug.WriteLine(result.LocalDateTime);  // Converted to your local timezone
    // You could also pretty much convert into any other zones
    // using the ToOffset() method.
}

答案 1 :(得分:1)

使用DateTimeOffsetTimeZoneInfo将日期字符串转换为带有中欧时间偏移的DateTimeOffset

string dateString = "09.06.2019 00:00:00";
// get timezone for Central European Time
TimeZoneInfo cet = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time");
// parse to local DateTimeOffset
var localDateTime = DateTimeOffset.ParseExact(dateString, "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture);
// get the UTC Offset value
var utcOffset = cet.GetUtcOffset(localDateTime.DateTime);
// convert to DateTimeOffset with CET timezone offset
var dateTimeWithTimeZone = new DateTimeOffset(localDateTime.DateTime, utcOffset);

// result dateTimeWithTimeZone.ToString()
// 12/09/2019 00:00:00 +01:00

此方法将正确处理夏令时(DST)。

答案 2 :(得分:0)

您可以使用:

DateTime dateTime = new DateTime(2010, 1, 1, 0, 1, 0,DateTimeKind.Unspecified);
dateTime=TimeZoneInfo.ConvertTimeToUtc(dateTime, 
    TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time"));

这可用于从文件中获取日期并将其保存为Utc时间中的DateTime对象。