14

グレゴリオ暦の日付から JDE ( JDEdwards ) ユリウス日付に変換するコードを書いています。

注: JDEのユリウス日は、ユリウス日という用語の通常の使用法とは異なります。

グーグルで調べた限りでは、JDE ユリウス日付の定義は次のとおりです。

1000*(year-1900) + dayofyear

ここで、year は 4 桁の年 (例: 2009)、dayofyear は 1 月 1 日を表す 1 で、12 月 31 日を表す 365 または 366 まで 1 年中カウントアップします (閏年かどうかによって異なります)。

私の質問はこれです: 1900 年より前の年はサポートされていますか? もしそうなら、上記の式はまだ成り立っていますか、それとも次のようにすべきです:

1000*(year-1900) - dayofyear

(プラスではなくマイナスに注意してください。)

または、他の何か?

この日付形式の公式ドキュメントへのリンクを持っている人はいますか?

4

9 に答える 9

12

JDE のユリウス日は、CYYDDD (世紀、年、通算日) で構成されます。

世紀は、19XX などの 20 番目の場合は 0 で、20XX などの 21 番目の場合は 1 です。

年は 2 桁です。したがって、101001 は 2001 年 1 月 1 日です。

ご覧のとおり、これは 1900 年より前の日付をサポートしません。

簡単で公式な説明については、この Oracle ページを参照してください:ユリウス日形式について

于 2009-12-15T10:21:32.813 に答える
2

JDE ユリウス日コンバーター」は、次の場合に負の値を返します。

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: How to Convert Julian Days to Dates in Access and Back」も、1900 年より前の日付をサポートしていません...政府機関や請負業者によって一般的に使用される「非公式の」ユリウス日について述べているためです。

この記事で使用する非公式のユリウス日の形式は、1 年の序数です (たとえば、ユリウス日 032 は 2 月 1 日または年の 32 日を表します)。
非公式のユリウス日形式のバリエーションには、前に 2 桁の年を使用する (たとえば、2/1/96 の場合は 96032)、年をダッシュ​​で区切る (たとえば、96-032) などがあります。
あまり一般的ではない別のユリウス日形式では、1 桁の年が使用されます (たとえば、6-032)。これらの追加の形式は、世紀または 10 年を一意に識別しません。これらの形式を使用する場合は、その結果を慎重に検討する必要があります。たとえば、ユリウス日 00061 は、2000 年 3 月 1 日または 1900 年 3 月 2 日と解釈できます。

于 2009-07-23T12:04:52.013 に答える
1

更新:申し訳ありませんが、JDEはおそらく別のものです。しかし、参考のために:

私が知っているJDEは違います。「天文学的アルゴリズム」(Jean Meeus、ISBN 0-943396-35-2)の59ページから:

「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、0hUTです。


ユリウス日としてのJDは誤称であることに注意してください。ユリウスです。JDはユリウス暦とは何の関係もありません。(これはウィキペディアの記事とは一致しません。これは、上記の本の著者である、天体力学を専門とするベルギーの天文学者、ジャン・メーウスによるものです。)

于 2009-09-22T19:23:39.020 に答える
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 ;                                              
于 2013-08-05T18:26:52.737 に答える
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
    }
于 2021-03-24T21:53:05.840 に答える
1

質問から外れているかもしれませんが、次の式を使用して Excel で変換できます。

ジュリアンを Excel で日付に変換する

セル A2 にユリウス日を配置します。
セル B2 に 102324 のように、次の数式を配置します: (コピーしてください)
=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で日付をユリウスに変換する

セル C2 に次の数式をコピーします。
=(YEAR(B2)-2000+100)*1000+B2-DATE(YEAR(B2),"01","01")+1

これにより、B2 が 102324 に変換されます。

于 2009-11-05T00:02:29.333 に答える
0

誰かが興味を持っている場合は、現在の時刻とエポック 1970 年 1 月 1 日の真夜中を使用する C の簡単な方法があります。しかし、これは JDE と同じではありませんが、日を計算するために数学を使用するという点では似ています。このアイデアは JDE に適用できると確信しています。私のように、この2つを混同する人もいます。ごめん。しかし、これは常に行われるべき時間参照の使用例であり、ほとんどのコンピューターがこれを使用しているため、日付にあまりこだわらず、このエポックの前後の日数を使用するのと同じくらい簡単です。

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;  
}
于 2015-05-22T16:47:40.063 に答える
0

うわー、これらの回答のいくつかには、JDE ユリウス日付との間で変換するためだけに複雑なコードがたくさんあります。Excel と VBA には、そこに到達するための簡単な方法があります。

ジュリアンから

Excel (ユリウス日が A1 にあると仮定):

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

VBA (ユリウス日、j、文字列として保存):

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 (ロング、j):

j = (Year(d) - 1900) * 1000 + DatePart("y", d)
于 2015-06-27T22:23:30.930 に答える
0

JDE ユリウス日とグレゴリオ暦の間で相互に変換する 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 ユリウス日をグレゴリオ暦 (DD/MM/YYYY) に変換し、XXXXXX を JDE ユリウス日を含む列名に置き換えます。

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 にある適切な値に置き換えます。

于 2015-03-18T12:01:37.903 に答える