Создать DateTime из строки без применения часового пояса или перехода на летнее время

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

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

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

Спасибо.


person Journeyman    schedule 20.05.2011    source источник
comment
Когда я только что попробовал Convert.ToDateTime(), он вернул точное значение, которое представляет строка. Вы звоните .ToUniversalTime()? Что вы делаете со значением после преобразования?   -  person NerdFury    schedule 20.05.2011


Ответы (5)


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

DateTime clientsideProfileSyncStamp =
  DateTime.Parse(
    "20-May-2011 15:20:00",
    CultureInfo.CurrentCulture,
    DateTimeStyles.AssumeUniversal
  );
person Guffa    schedule 20.05.2011

Использовать

DateTimeOffset.Parse

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

person Matt Howells    schedule 20.05.2011
comment
выглядит неплохо. Затем мне нужно передать его стороннему API, который ожидает std DateTime - каков самый безопасный способ преобразовать его в DateTime? - person Journeyman; 20.05.2011
comment
@Journeyman, просто откройте свойство DateTime переменной DateTimeOffset: dtVar = dtoffsetVar.DateTime - person chiapa; 27.05.2015

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

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

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

person Community    schedule 28.11.2017

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

DateTime clientsideProfileSyncStamp = Convert.ToDateTime("20-May-2011 15:20:00Z");
Console.Write(clientsideProfileSyncStamp.ToUniversalTime()); // 20-May-2011 15:20:00
person Forgotten Semicolon    schedule 20.05.2011

Не забывайте о варианте 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();
person KCD    schedule 28.07.2015