8

プログラムと出力。1970 年 1 月 1 日から 10,000,000 ミリ秒が 1969 年 11 月 31 日である理由を誰か説明してください。最初のテストで 1970 年 1 月 1 日から 10,000,000 ミリ秒の時間が生成されるはずであるという私の仮定の何が問題なのかを誰か説明してください。同じ結果です。

public static void main(String[] args) {

    String x = "10000000";
    long l = new Long(x).longValue();
    System.out.println("Long value: " + l);

    Calendar c = new GregorianCalendar();
    c.setTimeInMillis(l);
    System.out.println("Calendar time in Millis: " + c.getTimeInMillis());

    String origDate = c.get(Calendar.YEAR) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.DAY_OF_MONTH);  
    System.out.println("Date in YYYY-MM-DD format: " + origDate);

    x = "1000000000000";
    l = new Long(x).longValue();
    System.out.println("\nLong value: " + l);

    c.setTimeInMillis(l);
    System.out.println("Calendar time in Millis: " + c.getTimeInMillis());

    origDate = c.get(Calendar.YEAR) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.DAY_OF_MONTH);  
    System.out.println("Date in YYYY-MM-DD format: " + origDate);
}

長い値: 10000000

ミリ秒での暦時間: 10000000

YYYY-MM-DD 形式の日付: 1969-11-31

長い値: 1000000000000

ミリ秒での暦時間: 1000000000000

YYYY-MM-DD 形式の日付: 2001-8-8

4

6 に答える 6

12

印刷元の日付はCalendarタイムゾーンのローカルですが、エポックは UTC で 1970 年 1 月 1 日の午前 0 時と定義されています。したがって、UTC より西のタイムゾーンに住んでいる場合、(UTC では) まだ 1970-01-01 であっても、日付は 1969-12-31 と表示されます。

于 2008-11-04T21:03:29.877 に答える
6

最初にc.get(Calendar.MONTH)、1 月の場合は 0、2 月の場合は 1 などを返します。

次に、DateFormat日付を出力するために使用します。

第三に、あなたの問題は、Java の Date API がいかに扱いにくいかを示す好例です。可能であれば Joda Time API を使用してください。それはあなたの人生をいくらか楽にします。

タイムゾーンを示すコードのより良い例を次に示します。

public static void main(String[] args) {

    final DateFormat dateFormat = SimpleDateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);

    long l = 10000000L;
    System.out.println("Long value: " + l);
    Calendar c = new GregorianCalendar();
    c.setTimeInMillis(l);
    System.out.println("Date: " + dateFormat.format(c.getTime()));

    l = 1000000000000L;
    System.out.println("\nLong value: " + l);
    c.setTimeInMillis(l);
    System.out.println("Date: " + dateFormat.format(c.getTime()));
}
于 2008-11-04T21:05:55.720 に答える
5

Calendar#setTimeInMillis()は、カレンダーの時刻を 1970 年 1 月 1 日GMTからのミリ秒数に設定します。

Calendar#get()は、デフォルトでマシンのローカル タイムゾーンであるカレンダーのタイムゾーンに合わせて調整された要求されたフィールドを返します。

カレンダーを作成するときに「GMT」タイムゾーンを指定すると、これは期待どおりに機能するはずです。

Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
于 2008-11-04T21:18:48.427 に答える
3

悲しいことに、java.util.Dateこのjava.util.Calendar種の混乱につながる設計が不十分でした。

于 2008-11-05T00:25:11.217 に答える
1

あなたのタイムゾーンは GMT よりも遅れている可能性が最も高い (例: GMT-5) ため、エポックから 10,000,000 ミリ秒はあなたのタイムゾーンでは 1969 年 12 月 31 日ですがjava.util.CalendarCalendar-to-to-text 変換で月がゼロから始まるため、欠陥があり、1969- になります。予想される 1969-12-31 の代わりに 11-31。

于 2008-11-05T00:16:56.677 に答える
0

c.setTimeInMillis(l);ファーストインを変えれば自分でわかるc.clear();

于 2008-11-04T21:02:07.257 に答える