Создать DateTime из строки без применения часового пояса или перехода на летнее время - PullRequest
7 голосов
/ 20 мая 2011

Как мне создать переменную DateTime из строки, которая уже настроена для UTC? Я запускаю это на машине, установленной на BST (GMT + 1). Если я запускаю следующую строку кода:

DateTime clientsideProfileSyncStamp = Convert.ToDateTime("20-May-2011 15:20:00");

, а затем использовать значение в тесте со значениями, содержащими базу данных (UTC), тогда кажется, что Convert.ToDateTime () фактически дает мне значение UTC 14:20. Я не хочу, чтобы он выполнял преобразование - я просто хочу, чтобы он принял, что моя строка DateTime уже находится в UTC.

Спасибо.

Ответы [ 6 ]

17 голосов
/ 20 мая 2011

Разобрать строку и указать, что она должна принимать время UTC, когда в строке не указан часовой пояс:

DateTime clientsideProfileSyncStamp =
  DateTime.Parse(
    "20-May-2011 15:20:00",
    CultureInfo.CurrentCulture,
    DateTimeStyles.AssumeUniversal
  );
11 голосов
/ 20 мая 2011

Используйте

DateTimeOffset.Parse

Недостаточно рекламируемый тип DateTimeOffset представляет момент времени независимо от различий в часовых поясах, поэтому его следует использовать вместо DateTime, когда требуется указание времени.

3 голосов
/ 28 ноября 2017

@ Ответ Гуффы очень хороший, но я хотел бы добавить дополнительный ответ.Если ваша строка даты и времени выглядит так: «2017-11-27T05: 30: 00.000Z», то AssumeUniversal не работает.Попробуйте это:

    DateTime.Parse("2017-11-27T05:30:00.000Z", null, System.Globalization.DateTimeStyles.AdjustToUniversal);

Существует небольшая разница между AssumeUniversal и AdjustToUniversal.Читайте здесь: Разница между AssumeUniversal и AdjustToUniversal

2 голосов
/ 20 мая 2011

Добавьте Z в строку DateTime:

DateTime clientsideProfileSyncStamp = Convert.ToDateTime("20-May-2011 15:20:00Z");
Console.Write(clientsideProfileSyncStamp.ToUniversalTime()); // 20-May-2011 15:20:00
1 голос
/ 28 июля 2015

Не забудьте вариант TryParse, который позволяет обрабатывать ошибки синтаксического анализа без исключения

DateTime clientsideProfileSyncStamp;
DateTime.TryParse(
    "20-May-2011 15:20:00",
    System.Globalization.CultureInfo.CurrentCulture,
    System.Globalization.DateTimeStyles.AssumeUniversal,
    out clientsideProfileSyncStamp
);

Также, если вы не используете ParseExact или TryParseExact, предполагается, что вывод Kind равен Local, поэтому вы также можете использовать ToUniversalTime()

clientsideProfileSyncStamp.ToUniversalTime();
0 голосов
/ 20 мая 2011

DateTime.Parse() или DateTime.TryParse()

var clientsideProfileSyncStamp = DateTime.Parse("20-May-2011 15:20:00");
...