我正在编写代码以从公历日期转换为JDE(J.D.Edwards朱利安约会。
注意:a JDE 朱利安日期与该术语的正常使用不同 朱利安约会。
至于我可以从谷歌搜索,JDE朱利安日期的定义是:
1000*(year-1900) + dayofyear
其中年份为4位数年份(例如2009年),1月1日为1年,并且12月31日全年计入365或366(取决于这是否为闰年)。
我的问题是:在1900年前支持多年了?如果是的话,上述公式是否仍然适用,或者应该如此:
1000*(year-1900) - dayofyear
(注意减去而不是加号。)
或者是其他东西?
有没有人有这个日期格式的官方文档的链接?
JDE Julian日期包括CYYDDD,即世纪,年,日。
20世纪的世纪是零,例如19XX和21比21 20XX年。
这一年是两位数。
所以101001是2001年1月1日
如您所见,这将不支持1900年之前的日期。
有关简单和官方的解释,请参阅此Oracle页面: 关于朱利安日期格式
该 “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:如何将Julian Days转换为Access和Back中的日期“不支持1900年以前的日期......因为它说的是”非正式的“朱利安日, 通常由政府机构和承包商使用。
本文中使用的非正式Julian日格式是一年中的序数日(例如,Julian day 032表示2月1日,或一年中的第32天)。
非正式朱利安日格式的变化包括使用前两位数年份(例如96032为2/1/96)并用破折号分隔年份(例如96-032)。
另一种不太流行的朱利安日格式使用一位数年份(例如6-032)。这些额外的格式并不能唯一地标识这个世纪或十年。您应该仔细考虑使用这些格式时的后果;例如,Julian day 00061可以解释为3/1/2000或3/2/1900。
更新:对不起,JDE可能还有别的东西。但供参考:
我所知道的JDE是不同的。从书中的第59页开始
“天文算法”(Jean Meeus,ISBN 0-943396-35-2):
“如果JD对应于瞬间
以动力学的尺度衡量
时间(或星历时间),
表达朱利安星历日
通常使用(JDE)。 (不是JED
它有时是写的。 'E'是一个
附加到'JD'的索引类型)“
JD和JDE(在同一时间点)的价值接近
因为差异UT和ET大约是分钟。例如。 ET-UT在1990年为56.86秒,在1900年为-2.72秒。
还有MJD(改良朱利安日):
MJD = JD - 2400000.5
MJD的零点是1858-11-17,0h UT。
请注意,JD作为Julian日期是用词不当。它是
朱利安 天。 JD与朱利安无关
日历。 (这与维基百科的文章不一致,这个
来自上述书籍的作者, 让·梅乌斯 - 比利时天文学家,专门研究天体力学。)
也许从问题出发,您可以使用以下公式在Excel中进行转换:
在Excel中将Julian转换为Date
在Cell A2中放置一个Julian日期,如102324
在Cell 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中将日期转换为Julian
在Cell C2中复制此公式:
=(YEAR(B2)-2000+100)*1000+B2-DATE(YEAR(B2),"01","01")+1
这会将B2转换回102324
将以下源代码保存在名为JDEDATES的源成员中。使用第一行的runsqlstm来创建函数。然后你可以做一些事情
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 ;
在JDE Julian Date和Gregorian之间来回转换的VBA代码示例:
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日期:
(datepart(yy,getdate())-1900) * 1000 + datepart(dy, getdate())
将JDE Julian Date转换为Gregorian(DD / MM / YYYY),将XXXXXX替换为包含JDE Julian Date的列名:
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
如果有兴趣的话,我现在有一个简单的方法可以使用时间和时间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;
}