Как разобрать дату из файла и добавить информацию о часовом поясе - PullRequest
0 голосов
/ 14 октября 2019

Мне нужно проанализировать файл, который содержит временные метки, такие как: "09.06.2019 00:00:00". Человек, который предоставляет эти файлы, сказал мне, что эти временные метки находятся в часовом поясе «CET», который является UTC + 1 (без DST). Как я могу разобрать метки времени в соответствующих объектах DateTime? Единственное возможное решение, которое пришло мне в голову, - это проанализировать их, как если бы они были в формате UTC, а затем вручную добавить 1 час к объекту DateTime, но действительно ли это хорошее решение?

Заранее большое спасибо!

Ответы [ 3 ]

1 голос
/ 14 октября 2019

Сделайте свое будущее себе одолжение и используйте DateTimeOffset (вместо DateTime) при работе с часовыми поясами.

У Microsoft целая статья , объясняющая различные структуры, связанные с датой и временем.

Что касается синтаксического анализа 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.
}
0 голосов
/ 14 октября 2019

Используйте DateTimeOffset вместе с TimeZoneInfo для преобразования строки даты в 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).

0 голосов
/ 14 октября 2019

Вы можете использовать:

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

это может быть использовано, чтобы взять даты из файла и сохранить их как объекты DateTime во времени Utc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...