我正在编写代码以将公历日期转换为JDE(J.D.Edwards)Julian日期。
注意: JDE Julian日期与术语Julian date的正常用法不同。
就我可以从谷歌搜索来说,JDE Julian日期的定义是:
1000*(year-1900) + dayofyear
其中年份为4位数年份(例如2009年),1月1日为1年,并且12月31日全年计入365或366(取决于这是否为闰年)。
我的问题是:1900年之前的年份是否受到支持?如果是的话,上述公式是否仍然适用,或者应该如此:
1000*(year-1900) - dayofyear
(注意减去而不是加号。)
或其他什么?
是否有人有此日期格式的官方文档的链接?
答案 0 :(得分:10)
JDE Julian日期包括CYYDDD,即世纪,年,日。
20世纪是零,例如19XX和21比21 20XX。
这一年是两位数。 所以101001是2001年1月1日
如您所见,这不会支持1900年之前的日期。
请参阅此Oracle页面,获取简单的官方解释:About the Julian Date Format
答案 1 :(得分: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 software) Julian Date的示例,但这不是“官方”文档,似乎不支持1900年之前的日期......
注意:这个“ACC: How to Convert Julian Days to Dates in Access and 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。
答案 2 :(得分:1)
更新:抱歉,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与朱利安无关 日历。 (这与维基百科的文章不一致 来自上述书籍的作者,Jean Meeus - 一位专门研究天体力学的比利时天文学家。)
答案 3 :(得分:1)
也许不在问题中,您可以使用以下公式在Excel中进行转换:
在Excel中将Julian转换为日期
在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
答案 4 :(得分:1)
将以下源代码保存在名为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 ;
答案 5 :(得分:1)
聚会晚了好几年,但对于像我这样发现自己在使用这样的遗留系统的其他人,我希望我的一些 Java 代码片段能有所帮助。我正在利用这样一个事实,您可以将此 CYYDDD 格式转换为 yyyyDDD 格式并基于此进行解析。
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Calendar;
import java.util.SimpleDateFormat;
String jdeJulianDate = "099365"; //Testing with December 31, 1999
// Compile what the year number is
int centIndex = Integer.parseInt(jdeJulianDate.substring(0,1));
int yearIndex = Integer.parseInt(jdeJulianDate.substring(1,3));
int yearNumber = 1900 + (100 * centIndex) + yearIndex;
// Put the year number together with date ordinal to get yyyyDDD format
String fullDate = String.valueOf(yearNumber) + jdeJulianDate.substring(3,6);
// Date parsing, so need to wrap in try/catch block
try {
Date dt = new SimpleDateFormat("yyyyDDD").parse(fullDate);
// Validate it parses to a date in the same year...
Calendar cal = new GregorianCalendar();
cal.setTime(dt);
if (cal.get(Calendar.YEAR) != yearNumber) {
// Cases happen where things like 121366 (should be invalid) get parsed, yielding 2022-01-01.
// Throw exception or what-not here.
}
}
catch (Exception e) {
// Date parsing error handling here
}
答案 6 :(得分:0)
在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朱利安日期:
(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
答案 7 :(得分:0)
如果有兴趣的话,我现在有一个简单的方法可以使用时间和时间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 :(得分:0)
Excel(假设朱利安日期在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(来自朱利安日期,j,存储为Long):
d = DateSerial(1900 + Left$(j, Len(CStr(j)) - 3), 1, Right$(j, 3))
Excel(假设日期在A1中):
=(YEAR(A1)-1900)*1000+A1-DATE(YEAR(A1),1,0)
VBA(对于Long,j):
j = (Year(d) - 1900) * 1000 + DatePart("y", d)