Каково точное определение формата 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)