Как преобразовать двойное значение в DateTime в C#?

У меня есть значение 40880.051388, и я сохраняю его как двойное, если я открываю Excel и вставляю в ячейку и применяю следующий пользовательский формат "m/d/yyyy h:mm" в эту камеру, я получаю "12/3/2011 1:14"

Как я могу сделать этот анализ / преобразование в C#? Я не знаю, является ли значение миллисекундами с определенной контрольной точки, например, времени эпохи, или это значение в каком-то конкретном подготовленном формате, но как Excel справляется с этим конкретным значением? Это можно сделать в C#?

Я пытался работать с TimeSpan, DateTimeи другие подобные вещи в Visual Studio, но никуда не денутся.

5 ответов

Решение

Похоже, вы используете старую дату автоматизации OLE. использование

DateTime.FromOADate(myDouble)

Попробуйте что-то вроде этого:

double d = 40880.051388 ;
DateTime dt = DateTime.FromOADate(d);

Попробуйте использовать var dateTime = DateTime.FromOADate(40880.051388);,

Если вам нужно отформатировать его в строку, используйте dateTime.ToString("M/d/yyyy H:mm", CultureInfo.InvariantCulture) для этого. Это даст вам 24-часовую строку (изменить H в h для 12-часовой системы).

Если вам нужна большая точность (в 1000 раз или более), чем предложенная FromOADateСмотрите мой ответ в другой ветке.

Значение является смещением в днях с 30 декабря 1899 года. Итак, вы хотите:

new DateTime(1899, 12, 30).AddDays(40880.051388)

Следующий простой код будет работать

DateTime.FromOADate(myDouble)

Однако, если производительность критична, она может работать недостаточно быстро. Эта операция очень интенсивно использует процессор, поскольку диапазон дат для формата даты автоматизации OLE начинается 30 декабря 1899 г., тогда как DateTime начинается 1 января 0001 г. в григорианском календаре.

FromOADate вызывает функцию DoubleDateToTicks, используя myDouble в качестве единственного аргумента. Это возвращает количество тиков, и это значение используется для создания нового DateTime с неопределенным DateTimeKind.

Большая часть этой работы выполняется функцией DoubleDateToTicks в mscorlib. Это включает в себя код для генерации ArgumentException, когда значение типа double равно NaN, и существует множество способов оптимизации производительности в зависимости от ваших конкретных потребностей.

Другие вопросы по тегам