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

StackOverflow https://stackoverflow.com/questions/6073807

Вопрос

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

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

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

Спасибо.

Это было полезно?

Решение

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

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

Другие советы

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

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

Есть небольшая разница между AssumeUniversal и регулировкой.Читайте здесь: Разница между assumeUniversal и регулировкой>

Добавить генеракодицетагкод к строке TATETIME:

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

Не забывайте 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();

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top