2

yy = 15 (年)、D = 150 (年間通算日)、HH = 10 (時間)

 Date myDateWrong = new SimpleDateFormat("yyDHH").parse("1515010");
 Date myDateTrue = new SimpleDateFormat("yyD").parse("15150");

myDateTrue は正しく、2015 年 5 月 30 日です。myDateWrong は 30/05/2015 10:00:00 である必要がありますが、28/07/2015 18:00:00 のようです。ここで何が問題なのですか?

4

4 に答える 4

2

私は、wrongDate が (指定したように) 月に 1 桁を取り、残りの桁を時間に取ったと推測します (元の形式からユリウス日付の残りの桁を取ったのと同じように) )。2015 年、1 月、5010 時間が得られます。詳細な計算はしていませんが、5010 時間でおよそ 7 か月になり、7 月に終わることになります。18:00 時間は、残りの時間を反映するだけです。

したがって、ユリウス日の指定子として DDD を使用する必要があります (別のコメントで提案されているように ddd ではありません)。

于 2015-05-25T13:49:57.540 に答える
1

あなたのフォーマットは正しくありません。以下を使用する必要があります。

Date myDateWrong = new SimpleDateFormat("yydddhh").parse("1515010");
于 2015-05-25T13:38:18.030 に答える
0

あなたはする必要15150があります30/05/2015...しかし実際には12:00:00これを試してください:

String j = "15150";
Date date = new SimpleDateFormat("yyD").parse(j);
String g = new SimpleDateFormat("dd.MM.yyyy hh:mm").format(date);
System.out.println(g);
于 2015-05-25T13:39:47.957 に答える
0

tl;dr

LocalDateTime ldt = LocalDateTime.parse ( "1515010" , DateTimeFormatter.ofPattern ( "yyDHH" ) );
LocalDate ld = LocalDate.parse ( "15150" , DateTimeFormatter.ofPattern ( "yyD" ) );

ジュリアンではありません…序数の日付

通年の序数に「ユリウス」という用語を使用することは、技術的には正しくありませんが、それでも一般的に使用されています。実際のユリウス日とのあいまいさや混乱を避け、正確な序数の日付または「年間通算日」という用語に固執することをお勧めします。

java.time

ここでは、Java 8 以降に組み込まれているjava.timeフレームワークが役立ちます。以下のコード例は、両方のシナリオ (時間帯を使用する場合と使用しない場合) が java.time で正しく機能することを証明しています。

これらの java.time クラスは、java.util.Date. Oracle チュートリアルを参照してください。機能の多くは、 ThreeTen-Backportで Java 6 および 7 にバックポートされ、さらにThreeTenABPで Android に適合されています。

クラスでフォーマッタ パターンを定義しDateTimeFormatterます。フォーマット コードは のものと似ていますがSimpleDateFormat、まったく同じではないため、クラスのドキュメントを調べてください。このクラスでは、世紀を省略した場合、21 世紀 ( 20xx) が想定されます。

String input = "1515010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "yyDHH" );

LocalDateTime ldt = LocalDateTime.parse ( input , formatter );

ALocalDateTimeには、タイム ゾーンまたは UTC からのオフセット情報がありません。したがって、タイムライン上の瞬間を表すものではありません。この入力が UTC タイム ゾーンのコンテキストで意図されていると想定できる場合は、OffsetDateTime.

OffsetDateTime odt = ldt.atOffset ( ZoneOffset.UTC );

コンソールにダンプします。

System.out.println ( "input: " + input + " | ldt: " + ldt + " | odt: " + odt );

入力: 1515010 | ldt: 2015-05-30T10:00 | 奇数: 2015-05-30T10:00Z

時刻もタイムゾーンもない日付のみの値の場合、 をインスタンス化しLocalDateます。

String input = "15150";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "yyD" );
LocalDate ld = LocalDate.parse ( input , formatter );

コンソールにダンプします。

System.out.println ( "input: " + input + " | ld: " + ld );

入力: 15150 | ld: 2015-05-30

于 2016-07-09T05:13:22.557 に答える