2

与えられた:

private Calendar calendarInstance = Calendar.getInstance();

public long inMillis() {
    calendarInstance.set(year, month, day, hour, min);
    return calendarInstance.getTimeInMillis();
}

私が理解しているように、結果はエポックからの時間とともにミリ秒単位で返されます

エポックからのUTCミリ秒としての現在の時刻。

私のテストでは常にオブジェクトが同じに設定されているとすると、時間が経つにつれて結果が異なるのはなぜですか?

detailedMoment = new MomentInTime(2012, 11, 1, 19, 9);
detailedMoment.inMillis() // gives different results as time passes by

アップデート:

私は2番目に自分自身を推測し続けます ここに画像の説明を入力してください

同じ期間、私は

1_351_796_940 // http://www.epochconverter.com
1_354_410_540 // my number
4

4 に答える 4

2

秒やミリ秒を設定しません。 JavaDocは次のように述べています。

年、月、日、時、分のフィールドを設定します。 他のフィールドは変更されません。

于 2012-11-01T19:57:31.530 に答える
2

clear()を使用する必要があると思います。これを行うと、毎回正確なミリ秒数が返されます。

public long inMillis() {
    calendarInstance.clear();
    calendarInstance.set(year, month, day, hour, min);
    return calendarInstance.getTimeInMillis();
}

Java ドキュメントから

この Calendarのすべてのカレンダー フィールド値と時間値(millisecond offset from the Epoch)を未定義に設定します。つまり、isSet() はすべてのカレンダー フィールドに対して false を返し、日付と時刻の計算ではフィールドが設定されていないかのように扱います。Calendar 実装クラスは、日付/時刻の計算に特定のデフォルト フィールド値を使用できます。たとえば、GregorianCalendar は1970、YEAR フィールド値が定義されていない場合に使用します。

サンプルプログラム

public class MomentInTime {

private static Calendar calendarInstance = Calendar.getInstance();

public static long inMillis() {
    calendarInstance.clear();
    calendarInstance.set(2012, 10, 1, 19, 9);
    return calendarInstance.getTimeInMillis();
}

public static void main(String[] args) throws InterruptedException {
    for (int i = 0; i < 10; i++) {
        System.out.println(inMillis()/1000);
        Thread.sleep(300);
    }
}
}

出力:

 1351777140

ここに画像の説明を入力

于 2012-11-01T19:57:40.123 に答える
1

Calendar.getInstance() の秒数とミリ秒が不足しているためだと思います。

Calendar オブジェクトを置き換えているだけですがyear, month, day, hour, min、calendar インスタンスを取得するたびに、その特定の時点の秒とミリ秒が変わる可能性があります。

于 2012-11-01T19:56:46.303 に答える
1

java.time

java.utilDate-Time API とその書式設定 APIはSimpleDateFormat時代遅れで、エラーが発生しやすいものです。それらの使用を完全に停止し、最新の Date-Time APIに切り替えることをお勧めします*

java.time最新の Date-Time APIを使用したソリューション:

import java.time.LocalDate;
import java.time.ZoneOffset;

public class Main {
    public static void main(String[] args) {
        //Test
        System.out.println(inMillis(2021,6,19,8,30));
    }
    public static long inMillis(int year, int month, int day, int hour, int min) {
        return LocalDate.now()
                .atStartOfDay(ZoneOffset.UTC)
                .withYear(year)
                .withMonth(month)
                .withDayOfMonth(day)
                .withHour(hour)
                .withMinute(min)
                .toInstant()
                .toEpochMilli();
    }
}

出力:

1624091400000

ONLINE DEMO

これは、http://www.epochconverter.comが表示する方法です。

ここに画像の説明を入力

最新の Date-Time API の詳細については、Trail: Date Timeを参照してください。

アップデート:

より単純なバージョン(Ole VV に感謝):

public static long inMillis(int year, int month, int day, int hour, int min) {
    return OffsetDateTime.of(year, month, day, hour, min, 0, 0, ZoneOffset.UTC)
            .toInstant()
            .toEpochMilli();
}

* 何らかの理由で、Java 6 または Java 7 に固執する必要がある場合は、 java.time機能のほとんどを Java 6 & 7 にバックポートするThreeTen-Backportを使用できます。Androidプロジェクトと Android API で作業している場合レベルはまだ Java-8 に準拠していません。desugarで利用可能な Java 8+ APIと Android プロジェクトで ThreeTenABP を使用する方法 を確認してください。

于 2021-06-19T07:33:45.830 に答える