2

カスタム DMY (日付、月、年) オブジェクトを Date に変換する次のメソッドがあります。

public static Date serverCreateDateFromDMY(DMY pDMY, TimeZone pTimeZone)
    {
        Calendar vCalendar = Calendar.getInstance(pTimeZone);
        vCalendar.set(Calendar.YEAR, pDMY.getYear());
            // Below line is because DMY month counts are 1-indexed
            // and Date month counts are 0-indexed
        vCalendar.set(Calendar.MONTH, pDMY.getMonthOfYear() - 1);
        vCalendar.set(Calendar.DAY_OF_MONTH, pDMY.getDayOfMonth());
        System.out.println(vCalendar.getTime());
        TimeUtilsServer.zeroCalendarHoursAndBelow(vCalendar);
        System.out.println(vCalendar.getTime());
        return vCalendar.getTime();
    }


public static void zeroCalendarHoursAndBelow(Calendar pToZero)
    {
        pToZero.set(Calendar.HOUR_OF_DAY, 0);
        pToZero.set(Calendar.MINUTE, 0);
        pToZero.set(Calendar.SECOND, 0);
        pToZero.set(Calendar.MILLISECOND, 0);
    }

serverCreateDateFromDMY() メソッドに次の引数を渡します: DMY=20120424、TimeZone は America/New_York です。アプリケーションは、IST である私のタイムゾーンでローカルに実行されています。

上記の入力に基づいて、次の出力が表示されます。

Tue Apr 24 14:43:07 IST 2012

Tue Apr 24 09:30:00 IST 2012

ご覧のとおり、最後の出力時間はゼロになりません。何か提案はありますか?

@Marko、はい、DateFormatについて知り、次の例を試しました。ただし、日付は時間とともに印刷され、ゼロにはなりません。

TimeZone tz = TimeZone.getTimeZone("America/New_York");
        Calendar vCalendar = Calendar.getInstance(tz);
        vCalendar.set(Calendar.YEAR, 2012);

        vCalendar.set(Calendar.MONTH, 4 - 1);
        vCalendar.set(Calendar.DAY_OF_MONTH, 24);
        DateFormat df = DateFormat.getDateTimeInstance();
        df.setTimeZone(tz); 
        System.out.println(df.format(vCalendar.getTime()));

         vCalendar.set(Calendar.HOUR_OF_DAY,     vCalendar.getActualMinimum(Calendar.HOUR_OF_DAY));
        vCalendar.set(Calendar.MINUTE, vCalendar.getActualMinimum(Calendar.MINUTE));
        vCalendar.set(Calendar.SECOND, vCalendar.getActualMinimum(Calendar.SECOND));
        vCalendar.set(Calendar.MILLISECOND,   vCalendar.getActualMinimum(Calendar.MILLISECOND));
        System.out.println(df.format(vCalendar.getTime()));
4

3 に答える 3

2

内部的には、Date および Calendar オブジェクトは UTC で保存されます。フィールドを 0 に設定すると、カレンダーは UTC で更新されます。

カレンダーに時間を尋ねると、日付が希望のタイムゾーンに変換されるため、違いが生じます。

于 2012-04-24T09:58:15.040 に答える
2

Java Date / Time API は、作成時から設計が悪いです。たぶん、いくつかのライブラリを見てみる必要があります - たとえば、これはJDK APIの欠陥を隠しています - http://joda-time.sourceforge.net/

于 2012-04-24T09:44:29.680 に答える
1

...そしてあなたはニューヨーク時間より9時30分進んでいます。あなたは時間をニューヨーク時間の真夜中に設定し、それをあなたのゾーンの時間として読み上げます。getTimeを返すことに注意してくださいDate。これはタイムゾーンで構成できません。DateFormat結果を印刷するタイムゾーンを指定する場合に必要になります。

于 2012-04-24T09:55:27.663 に答える