2

2000 年から数えた秒数として日付が指定されている場所と通信する必要があるデバイスで定義された、カスタム定義の日付形式を解析する必要があります。

GregorianCalendarこのデータを解析するために使用しようとしましたが、これは私が試したコードです:

    GregorianCalendar calendar = new GregorianCalendar();
    calendar.setGregorianChange(new Date(2000 - 1900, 0, 1));

Dateオブジェクトは 2000 年 1 月 1 日に対応します。これで、 をミリ秒単位ではなく秒単位でカウントするため、読み取った時間に を掛けた正しい日付を取得することは問題ないと思いましたが、機能setTimeInMillisしませんでした。に対応する時間が 2000 年 1 月 1 日に対応するのを待ってみましたが、そうではなく、1969 年 12 月 18 日に対応します。1000GregorianCalendarsetTimeInMillis(0)calendar

2000 年 1 月 1 日に対応するGregorianCalendarように構成するにはどうすればよいですか? setTimeInMillis(0)それが不可能な場合、すべてのコードを自分で作成する代わりに使用できる他のクラスはありますか?

前もって感謝します。

4

5 に答える 5

2

setGregorianChangeユリウス暦からグレゴリオ暦への切り替えが発生した時点のみを変更します。これは、正しい履歴値にデフォルト設定されます。

しかし、ほとんどの人が先発グレゴリオ語を使用しているため、この関数には有効な使用例があります。

setGregorianChange(new Date(Long.MIN_VALUE)) //Julian never happened

これは、JodaTime がデフォルトで使用するものでもあります。

946684800000Lとにかく、通常のミリ秒単位の UNIX タイムスタンプから減算して、1000 で割ることができます。

public static long secondsSince2000(Date input) {
    final long epoch = 946684800000L;
    return (input.getTime() - epoch) / 1000L;
}

2000 年以降の秒から変換するには:

public static Calendar fromSecondsSince2000( long seconds ) {
    final long epoch = 946684800000L;
    Calendar cal = GregorianCalendar.getInstance();
    long timestamp = epoch + seconds * 1000L;
    cal.setTime(new Date(timestamp));
    return cal;
}

両方が機能していることを確認するには:

    long sec = secondsSince2000(new Date());
    Calendar cal = fromSecondsSince2000( sec );
    System.out.println(cal.getTime().toString().equals(new Date().toString()));

彼らは印刷する必要がありますtrue

于 2012-12-13T11:31:38.390 に答える
2

2000/01/01 の日付を作成し、ミリ秒単位で時刻を取得してから、デバイスからミリ秒単位で時刻を取得します。この 2 つを追加して、心に残る日付とカレンダーを作成してください...

于 2012-12-13T10:19:16.903 に答える
1

の非推奨のコンストラクターを使用していDateます。さらに、あなたはそれを間違った方法で使用しています。

GregorianCalendar(年 + 1900 年、月、日) である必要があります。Oracle Docsによると

ところで、なぜJodaTimeを使用しないのですか? 次に、多くの便利なものを取得します。

DateTime dt = new DateTime(year, monthOfYear, dayOfMonth, hourOfDay, minuteOfHour);
于 2012-12-13T10:24:06.397 に答える
0

これでいい

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("America/Los_Angeles")); // change the timezone as you wish
cal.set(Calendar.YEAR, 2000);
cal.set(Calendar.MONTH, 0);
cal.set(Calendar.DATE, 1);   
cal.set(Calendar.HOUR, 00);
cal.set(Calendar.MINUTE, 00);
cal.set(Calendar.SECOND, 00);
cal.set(Calendar.MILLISECOND, 00);

cal.add(Calendar.MILLISECOND, 1000); // calculate and add your millisec here where 1000 is added 
于 2012-12-13T10:36:02.687 に答える
0

やりたいことは、デフォルトで 2000/01/01 であるエポック (Unix タイムスタンプ) を変更することです。つまり、エポックが 2000/01/01 の Unix タイムスタンプのようなものが必要になります。

2000/01/01 のミリ秒単位の UNIX タイムスタンプを取得し、定数として保存します。ここで、GregorianCalendar をサブクラス化して、入力データからこれらのミリ秒を追加し、正しい日付を返すことができるようにします。

JSR-310も参照してください。

于 2012-12-13T10:23:05.050 に答える