Каково точное определение формата JDE Julian Date?

Я пишу код для преобразования из григорианской даты в JDE (J.D.Edwards) Юлианская дата.

Примечание: дата JDE Джулиан отличается от обычного использования термина Julian date.

Насколько я могу исходить из Googling, определение даты JDE Julian:

1000*(year-1900) + dayofyear

где год - это 4-значный год (например, 2009 год), а dayofyear - 1 для 1 января и подсчитывает весь год до 365 или 366 на 31 декабря (в зависимости от того, является ли это високосным годом).

Мой вопрос заключается в следующем: поддерживаются ли годы до 1900 года? Если да, имеет ли приведенная выше формула, или она должна быть такой:

1000*(year-1900) - dayofyear

(обратите внимание минус вместо плюса.)

или что-то еще?

Кто-нибудь имеет ссылку на официальную документацию для этого формата даты?

Ответ 1

Дата JDE Julian состоит из CYYDDD, которая представляет собой век, год, день года.

Век равен нулю для 20, например. 19XX и один для 21-го, например. 20XX.

Год состоит из двух цифр. Итак, 101001 - 1 января 2001 года.

Как вы можете видеть, это не будет поддерживать даты до 1900 года.

См. эту страницу Oracle для простого и официального объяснения: О формате даты Джулиана

Ответ 2

"JDE Julian Date Converter" возвращает отрицательное значение для:

1809/07/23 : -90635

В отличие от классической юлианской даты:

The Julian date for CE  1809 July 23 00:00:00.0 UT is
JD 2381986.50000

Вот пример JD EDWARDS (программное обеспечение AS/400) Julian Date, но это не официальная документация, и это похоже, не поддерживает даты до 1900 года...

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

Неформальный формат Юлианского дня, используемый в этой статье, является порядковым днем ​​года (например, июльский день 032 представляет 1 февраля или 32-й день года).
Вариации в форматах неформального юлианского дня включают использование предшествующего двухзначного года (например, 96032 для 2/1/96) и разделение года на тире (например, 96-032).
Другой, менее популярный формат Юлианского дня использует год с цифрой (например, 6-032). Эти дополнительные форматы не однозначно идентифицируют столетие или десятилетие. Вы должны тщательно учитывать последствия использования этих форматов; например, июльский день 00061 можно интерпретировать как 3/1/2000 или 3/2/1900.

Ответ 3

Обновление. Извините, JDE, вероятно, что-то еще. Но для справки:

JDE, о котором я знаю, отличается. Со страницы 59 в книге "Астрономические алгоритмы" (Jean Meeus, ISBN 0-943396-35-2):

"Если JD соответствует мгновенному измеренный в масштабе динамического Время (или время эфемерид), выражение Юлиан Эфемерис День (JDE). (Не JED as
это иногда написано." E "- это тип индекса, добавленный к" JD ")"

JD и JDE (для одного и того же момента времени) близки по значению так как разность UT и ET составляет порядка минут. Например. ET-UT составлял 56,86 секунды в 1990 году и -2,72 секунды в 1900 году.

Существует также MJD (Модифицированный юлианский день):

MJD = JD - 2400000.5

Нулевая точка для MJD равна 1858-11-17, 0h UT.


Обратите внимание, что JD как дата Джулиана является неправильным. это Юлиан день. JD не имеет ничего общего с Джулианом календарь. (Это противоречит статье Википедии, это от автора книги, упомянутой выше, Jean Meeus - бельгийский астроном, специализирующийся на небесной механике.)

Ответ 4

Возможно, вопрос невозможен, вы можете конвертировать в Excel по следующей формуле:

Преобразование Julian в Date в Excel

В ячейке A2 укажите юлианскую дату, например, 102324
в ячейке B2 поместите эту формулу: (скопируйте ее)
=DATE(YEAR("01/01/"&TEXT(1900+INT(A2/1000),0)),MONTH("01/01/"&TEXT(1900+INT(A2/1000),0)),DAY("01/01/"&TEXT(1900+INT(A2/1000),0)))+MOD(A2,1000)-1

Дата даты 11/20/02 появится в ячейке B2

Преобразование даты в Юлиан в Excel

В Cell C2 скопируйте эту формулу:
=(YEAR(B2)-2000+100)*1000+B2-DATE(YEAR(B2),"01","01")+1

Это преобразует B2 обратно в 102324

Ответ 5

Сохраните приведенный ниже исходный код в исходном элементе, называемом JDEDATES. Используйте runqlstm в первой строке для создания функций. Затем вы можете делать такие вещи, как

select  jde2date(A1UPMJ), f.* from f00095 f                            

и посмотреть реальную дату.

Источник:

--RUNSQLSTM SRCFILE(qtxtsrc) SRCMBR(JDEDATES) COMMIT(*NONE)  NAMING(*SQL) 
 -- jde 2 date                                                                    

 create function QGPL/jde2date ( d decimal(7,0))                                  
 returns date                                                                     
 language sql                                                                     
 deterministic                                                                    
 contains sql                                                                     
    SET OPTION DATFMT=*ISO                                                        
 BEGIN                                                                            
  if d=0 then return null;                                                        
  else                                                                            
       return date(digits(decimal(d+1900000,7,0)));                               
  end if;                                                                         
 end;                                                                            -- date 2 jde                                     
 create function QGPL/date2jde ( d date)           
 returns decimal(7,0)                              
 language sql                                      
 deterministic                                     
 contains sql                                      
    SET OPTION DATFMT=*ISO                         
 BEGIN                                             
  if d is null then return 0;                      
  else                                             
  return (YEAR(D)-1900)*1000+DAYOFYEAR(D);         
  end if;                                          
 end ;                                              

Ответ 6

Образец кода VBA для преобразования назад и вперед между JDE Julian Date и григорианским:

Public Const Epoch = 1900
Public Const JDateMultiplier = 1000
Public Const FirstJan = "01/01/"

Public Function Julian2Date(ByVal vDate As Long) As Date

    Dim Year As Long
    Dim Days As Long
    Dim SeedDate As Date

    '   Day Number
    Days = vDate - (Int(vDate / JDateMultiplier) * JDateMultiplier) - 1
    '   Calendar Year
    Year = ((vDate - Days) / JDateMultiplier) + Epoch
    '   First Day of Calendar Year
    SeedDate = CDate(FirstJan + CStr(Year))

    '   Add Number of Days to First Day in Calendar Year
    Julian2Date = DateAdd("d", Days, SeedDate)

End Function

Public Function Date2Julian(ByVal vDate As Date) As Long

    Dim JYear As String
    Dim BeginDate As Date
    Dim JDays As Long

    '   Calendar Year
    JYear = Format(Year(vDate), "0000")
    '   First Day of Calendar Year
    BeginDate = CDate(FirstJan + JYear)
    '   Day Number
    JDays = DateDiff("d", BeginDate, vDate) + 1

    '   Add Number of Days to Year Number
    Date2Julian = ((CLng(JYear) - Epoch) * JDateMultiplier) + JDays

End Function

Я попытался сделать это максимально ясным и простым, и с этой целью я умышленно не заметил ошибок. Тем не менее, вы должны иметь возможность добавить код в модуль VBA и вызвать их непосредственно из своего собственного кода.

Я также включаю некоторые полезные фрагменты T-SQL:

Сегодняшняя дата как JDE Julian Date:

 (datepart(yy,getdate())-1900) * 1000 + datepart(dy, getdate())

Преобразуйте JDE Julian Date в григорианский (DD/MM/YYYY), замените XXXXXX именем столбца, содержащим дату JDE Julian:

convert (varchar, dateadd (day,convert (int, right(XXXXXX,3)) - 1, convert (datetime, ('1/1/' + convert ( varchar, (cast(left(right(XXXXXX+1000000,6),3) as varchar) + 1900))))),103)

Если вам нужен другой григорианский формат, замените значение 103 (справа в конце) на применимое значение, найденное здесь: https://msdn.microsoft.com/en-us/library/ms187928.aspx

Ответ 7

У меня есть простой способ для C использовать время сейчас и эпоху 1970, 01, 01 полночь, если кому-то интересно. Но это для Julian Day Numbers, который не совпадает с JDE, но они похожи на использование математики для вычисления дней, и я уверен, что эта идея может быть адаптирована для JDE. Иногда люди просто путают этих двух, как я. Сожалею. Но все же это пример использования временной привязки, которая всегда должна выполняться, и поскольку большинство компьютеров используют это, нам было бы так же легко не увязнуть в датах и ​​просто использовать дни до или после этой эпохи.

Поскольку JDE теперь принадлежит Oracle, они также теперь поддерживают Julian_Day. видеть: https://docs.oracle.com/javase/8/docs/api/java/time/temporal/JulianFields.html

#include <stdio.h>
#include <time.h>
#define EPOCH (double)  2440587.5 /* Julian Day number for Jan. 01, 1970 midnight */
int main ()
{
 double days = time(0)/86400.0;

 printf ("%f days since January 1, 1970\n", days);

 printf ("%f\n", days + EPOCH);

 return 0;  
}

Ответ 8

Ничего себе, в некоторых из этих ответов есть много сложного кода, чтобы преобразовать даты JDE и из них. Есть простые способы в Excel и VBA, чтобы добраться туда.

FROM JULIAN

Excel (предполагается, что julian date находится в A1):

=DATE(1900+LEFT(A1,LEN(A1)-3),1,RIGHT(A1,3))

VBA (из julian date, j, сохраняется как String):

d = DateSerial(1900 + Left$(j, Len(j) - 3), 1, Right$(j, 3))

VBA (из julian date, j, сохраняется как Long):

d = DateSerial(1900 + Left$(j, Len(CStr(j)) - 3), 1, Right$(j, 3))

TO JULIAN

Excel (предполагается, что дата указана в A1):

=(YEAR(A1)-1900)*1000+A1-DATE(YEAR(A1),1,0)

VBA (до длинного, j):

j = (Year(d) - 1900) * 1000 + DatePart("y", d)