2016-03-10 3 views
0

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

42437,4261290278
42437,5460402431
42437,5478825116

причем наибольший из последних является самым последним. Один из нас считает, что он относится к эпохе unix и альтернативным представлениям времени. Проблема, с которой мы сейчас сталкиваемся, заключается в том, чтобы прочитать эти данные в стандартном формате MM-DD-YYYY. У кого-нибудь есть идеи о том, как преобразовать эти альтернативные формы даты в стандартные даты?

Я пытаюсь сделать это на C#. И для справки, я ожидаю, что последние две даты, перечисленные, будут когда-то 8 марта 2016 года, а первые - до того времени.

+0

Возможно, вы захотите указать, откуда появился набор данных.Это из другого приложения, базы данных или таблицы? Лучше всего предположить, что это целый ряд дробных дней с некоторых базовых уровней, но, не зная базовой даты или единиц, преобразование будет предположением. 42437 дней тому назад где-то около 1900 или 1901. –

+0

Я думаю, что IBM может использовать базовый уровень 1900-01-01 для некоторых вычислений даты ... –

+0

Это из базы данных Oracle. На самом деле единственной информацией, к которой я имею доступ, являются сами цифры. – RunFranks525

ответ

1

После вашего утверждения, что даты, представленные в 2016-03-08, я предполагаю, что начало эпохи является 1899-12-30:

static string UnixTimeStampToDateAsString(double ts) 
{ 
    DateTime epoch = new DateTime(1899, 12, 30); 
    DateTime d = epoch.AddDays(ts); 
    return (d.ToString("yyyy-MM-dd HH:mm:ss")); 
} 

static void Main(string[] args) 
{ 
    foreach (double dateNumber in new double[] { 42437.4261290278, 42437.5460402431, 42437.5478825116 }) 
    { 
     Console.WriteLine(UnixTimeStampToDateAsString(dateNumber)); 
    } 
    Console.ReadLine(); 

} 

Выходы:

2016-03 -08 10:13:37
2016-03-08 13:06:17
2016-03-08 13:08:57

Я должен заявить, что 30 декабря 1899 года представляет собой довольно маловероятную ценность, но я полагаю, что у кого-то могла быть «причина» использовать это.

Редактировать Благодаря @EricLippert я могу предложить это вместо:

Console.WriteLine(DateTime.FromOADate(dateNumber).ToString("yyyy-MM-dd HH:mm:ss")); 
+0

На самом деле, не только есть причина, основатель этого сайта может рассказать вам, что это за причина. См. Мой ответ. –

+0

@EricLippert Спасибо! Это напомнило мне о функциях OADate. Вам или Джоэлю пришлось написать метод DateTime.FromOADate? Я вижу, что Раймонд Чен говорит, чтобы использовать их в статье, связанной с твоей. –

+0

Я этого не делал. Я написал эту функцию во время выполнения JScript и большую часть библиотеки дат VBScript. Хорошие времена. Джоэл покинул MSFT в 1994 году, и я никогда не встречался с ним, когда я был стажером. –

6

Эти значения OLE Automation VT_DATE. Это система дат, используемая продуктами Microsoft, такими как Excel и pre -.NET версии Visual Basic. Это несколько причудливый формат даты.

Формат: считать двойным, чтобы иметь две части: целое число со знаком и беззнаковое дробь. Подписанное целое число - это число дней с 30 декабря 1899 года. Примечание НЕ 31 декабря 1899 года и НЕ 1 января 1900 года. Фракция является частью 24-часового (всегда!) Дня. Никакая корректировка не производится в течение 23 или 25 часов, которые мы проводим дважды в год.

Этот формат имеет интересную для меня историю; Вы можете прочитать об этом в своем блоге статью от 2003 года:

https://blogs.msdn.microsoft.com/ericlippert/2003/09/16/erics-complete-guide-to-vt_date/

И статья основателя Stack Overflow Джоэл Спольски от 2006:

http://www.joelonsoftware.com/items/2006/06/16.html

Обратите внимание, что если у вас есть отрицательные значения VT_DATE то вы должны быть очень осторожны, чтобы получить правильное преобразование. Код не сложно; это всего лишь пара строк, но вы должны осторожно рассуждать об этом. Раньше я задавал вопрос «разницу между двумя VT_DATE» в качестве вопроса о собеседовании, и удивительное количество кандидатов на самом деле не может делать вычитание.

+0

Люди могут вас ненавидеть в отдаленном будущем за все ваши признания: D Умные люди не умеют :) – leppie

+0

OT: Я бы хотел, чтобы вы были более активны в обсуждениях на C# на Github, хотя бы для исторической проницательности. Вы знаете больше, чем большинство в этом домене. – leppie

+1

@leppie: Я имел в виду это сделать. Не хватает часов в день! –

Смежные вопросы