Nano Hash - криптовалюты, майнинг, программирование

Проблема TimeZoneInfo.ConvertTimeToUtc

У нас возникла проблема, когда один разработчик создает приведенный ниже код, и он работает в его среде DEV. Но когда он проверен в QA, код прерывается следующим сообщением об ошибке:

myRecord.UTCStartTime = TimeZoneInfo.ConvertTimeToUtc(myRecord.StartTime, myTimeZone);

Преобразование не может быть завершено, так как для предоставленного DateTime свойство Kind не установлено правильно. Например, если свойство Kind имеет значение DateTimeKind.Local, часовой пояс источника должен быть TimeZoneInfo.Local.

В моей среде DEV приведенный выше код генерирует ту же ошибку, что и сервер QA. Я применил следующее изменение, чтобы решить проблему:

DateTime utcStart = DateTime.SpecifyKind(myRecord.StartTime, DateTimeKind.Unspecified);
myRecord.UTCStartTime = TimeZoneInfo.ConvertTimeToUtc(utcStart, myTimeZone);

Почему первый пример кода работает в среде DEV1, но не работает в моей среде DEV и на нашем сервере контроля качества?

01.05.2013

Ответы:


1

Это зависит от того, как был создан myRecord.StartTime.

  • Если вы получили его от DateTime.Now, то он будет иметь вид Local.
  • Если вы получили его от DateTime.UtcNow, то он будет иметь тип Utc.
  • Если вы получили его от new DateTime(2013,5,1), то он будет иметь тип Unspecified.

Это также зависит от того, откуда вы взяли myTimeZone. Например:

  • TimeZoneInfo.Local
  • TimeZoneInfo.Utc
  • TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time")

Функция TimeZoneInfo.ConvertTimeToUtc будет работать только в том случае, если она может сопоставить зону с тем типом, который вы ей задаете. Если оба являются локальными или оба UTC, то это сработает. Если вы даете ему определенную зону, то тип не должен быть указан. Это поведение задокументировано в MSDN.

Вы можете легко воспроизвести исключение последовательно:

var tz = TimeZoneInfo.FindSystemTimeZoneById("Fiji Standard Time");
var utc = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now, tz);

Предполагая, что вы не живете на Фиджи, это будет каждый раз ошибаться. Вы в основном сказали: «преобразовать мое местное время в какой-то другой зоне в utc», что не имеет смысла.

Это, вероятно, работает в вашей среде разработки, потому что значение, которое вы тестируете для myTimeZone, оказывается локальной зоной для разработчика.

Что касается вашего изменения - конечно, вы можете заставить вид быть неопределенным, и это меняет смысл того, что вы делаете, так что это имеет смысл. Но вы уверены, что это то, что вы хотите? Что такое .Kind даты перед рукой? Если это еще не Unspecified, то у него есть какое-то намерение. Вероятно, вам следует вернуться к источнику этих данных и убедиться, что это именно то, что вы ожидаете.

Если все это звучит безумно, безумно, разочаровывающе и странно, то это потому, что объект DateTime воняет. Вот дополнительное чтение:

Вместо этого вы можете использовать NodaTime. Его API убережет вас от таких распространенных ошибок.

01.05.2013
  • Вы можете использовать DateTime.Ticks для обхода несовместимости Local/Utc. Вот так, когда я читаю время UTC из таблицы: var timeUtc = new DateTime(r.GetDateTime(r.GetOrdinal(TimeUtc)).Ticks, DateTimeKind.Utc); 07.08.2019
  • Это просто более сложный способ установить вид. Вы можете получить то же самое с DateTime.SpecifyKind. 07.08.2019

  • 2

    в этом примере я преобразовал локальный часовой пояс в неуказанный тип, поэтому он отлично работает для меня, используя метод DateTime.SpecifyKind()

    DateTime.SpecifyKind(utc,DateTimeKind.Unspecified);

    этот метод Создает новый объект DateTime, который имеет то же количество тиков, что и указанный объект DateTime, но обозначается как неуказанный тип DateTimeKind.

    общественное статическое DateTime ConvertLocalDate (DateTime utc) {

            string id = ConfigurationManager.AppSettings["Timezone"].ToString();
            TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById(id);
            utc = DateTime.SpecifyKind(utc,DateTimeKind.Unspecified);
            DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(utc, cstZone);
            return cstTime;
        }
    
    21.12.2015

    3

    Здесь я нашел действительно простое решение не-иметь-вид-свойство-правильно-на-пример-когда-вид-свойство-это-дата-время-местный-исходный-часовой-зона-должен/" rel="nofollow">https ://kiranpatils.wordpress.com/2011/01/09/the-conversion-could-not-be-completed-because-the-supplied-datetime-did-not-have-the-kind-property-set-правильно -for-example-when-the-kind-property-is-datetimekind-local-the-source-time-zone-must/

    Что, по-видимому, происходит только при использовании DateTime.Now. Я обновляю свой код следующим образом, и он снова работает :)

    DateTime currentTime = new DateTime (DateTime.Now.Ticks, DateTimeKind.Unspecified);

    05.04.2016

    4

    В основном то, что было сказано в предыдущих ответах, но для сокращения:

    DateTime.Now или DateTime.Today устанавливает вид на Local, поэтому измените его на Unspecified

    В методе, который обрабатывает даты:

    // Incoming date has DateTimeKind.Local 
     var localDateTime = DateTime.Now;
    
    // Set to unspecified
     var unspecifiedDateTime = DateTime.SpecifyKind(localDateTime, DateTimeKind.Unspecified); 
    

    Я получил это только при развертывании, а затем понял, что библиотека передает методу DateTime.Now, а не new DateTime(...).

    02.06.2021
    Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..