Использование формата DateTime в C# - PullRequest
0 голосов
/ 20 марта 2020

У меня следующий формат даты и времени

TimeZoneDetails.TimeZoneInstance ="Australia/Perth"
DateTime Today = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow,TimeZoneDetails.TimeZoneInstance);

Сохраняет ли переменная сегодня дату, основанную на часовом поясе?

string date = "2020-03-19";
DateTime startdate = DateTime.Parse(date);

Что такое часовой пояс переменной startdate?

DateTime enddate = TimeZoneInfo.ConvertTimeToUtc(startdate, TimeZoneDetails.TimeZoneInstance);

Будет ли enddate переменная преобразована в UT C время?

1 Ответ

1 голос
/ 21 марта 2020

Несколько вещей:

  • "Australia/Perth" - это идентификатор часового пояса IANA. Он будет работать с NET на Linux или Ma c OSX, но на Windows вам придется использовать "W. Australia Standard Time". Кроме того, вы можете использовать мою библиотеку TimeZoneConverter для работы с любой формой идентификатора на любой платформе.

  • В вашем коде:

    TimeZoneDetails.TimeZoneInstance ="Australia/Perth"
    

    Это обычно не действует. Учитывая использование в остальной части вашего кода, ваш TimeZoneInstance должен был бы быть TimeZoneInfo объектом. Вы не можете назначить строку таким образом. Вам придется использовать такую ​​функцию, как TimeZoneInfo.FindSystemTimeZoneById или TZConvert.GetTimeZoneInfo из TimeZoneConverter, или аналогичную функцию в вашем собственном коде. (Также вам не хватает точки с запятой.)

  • В вашем коде:

    string date = "2020-03-19";
    DateTime startdate = DateTime.Parse(date);
    

    Вы спросили, какой часовой пояс находится в startdate переменная. Это DateTime, который не хранит информацию о часовом поясе или смещении. Он имеет только свойство .Kind типа DateTimeKind. В вашем примере это будет DateTimeKind.Unspecified. Также обратите внимание, что время будет установлено на 00:00:00.0000000.

    Подробнее об этом вы можете прочитать в документации, здесь и здесь .

  • В вашем коде:

    DateTime enddate = TimeZoneInfo.ConvertTimeToUtc(startdate, TimeZoneDetails.TimeZoneInstance);
    

    Да, это будет правильно преобразовать DateTime из часового пояса, указанного в UT C. Поскольку startdate.Kind == DateTimeKind.Unspecified, значение рассматривается как принадлежащее указанному часовому поясу. Результирующее значение будет иметь enddate.Kind == DateTimeKind.Utc.

    . Вы можете прочитать больше в документации, здесь .

  • В комментариях вы спросили:

    какой из них используется по умолчанию для DateTimeKind?

    Это зависит от того, какой метод вы вызываете для создания DateTime, и какие значения вы передаете. В вашем случае, поскольку вы вызываете DateTime.Parse и передаете строку, которая не содержит информацию о смещении часового пояса, полученное значение будет .Kind == DateTimeKind.Unspecified. Вы можете прочитать больше о поведении DateTime.Parse в разделе замечаний здесь . Другие методы и конструкторы ведут себя аналогично, но вы должны проверить документацию для каждого или проверить результаты самостоятельно. Вы можете найти ошибки преобразования, если, например, вы думаете, что DateTime имеет Unspecified вид, но на самом деле имеет Local вид из-за того, как вы его получили.

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