Как преобразовать двойное значение в 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);

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

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

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

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

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


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

DateTime.FromOADate(myDouble)

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

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

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