1

オブジェクトに入れようとしているタイムスタンプがありDateますが、Calendar を使用すると奇妙な問題が発生します。必要な値で Date オブジェクトを作成できないようです:

public static void main(String args[]){
    Date today = new Date();
    int hour = 4, min=0, sec=0, ms=64;

    Calendar cal = GregorianCalendar.getInstance();

    cal.clear();
    cal.setTimeZone(TimeZone.getTimeZone("EDT"));
    cal.setTime(today);
    cal.set(Calendar.HOUR_OF_DAY,hour);
    cal.set(Calendar.MINUTE,min);
    cal.set(Calendar.SECOND,sec);
    cal.set(Calendar.MILLISECOND,ms);

    System.out.println("Time is: "+cal.getTime());
}

これにより、次が生成されます。

Time is: Mon Jan 13 23:00:00 EST 2014

これは私が探している結果ではありません。

ただし、「setTimeZone」メソッド呼び出しをコメント アウトすると、次の結果が得られます。

Time is: Tue Jan 14 04:00:00 EST 2014

これは私が探している結果ですが、同じタイム ゾーンで実行されていないマシンで実行している場合、一貫した動作が得られないことが懸念されます。

4

6 に答える 6

1

The problem here is that Java does not know of the timezone "EDT" (Eastern Daylight Time). As a result, Calendar seems to be setting the timezone to GMT.

The timezone needed here is "America/New_York" or "EST5EDT". When either of these values are used, the correct result is produced.

The list of valid Time Zones can be obtained by calling TimeZone.getAvailableIDs()

It is unfortunate that no warnings are produced when the requested Time Zone is not found.

于 2014-01-14T21:47:31.567 に答える
0

Calendar.getTime()オブジェクトを返しjava.util.Dateます。Dateオブジェクトはタイムゾーンについて何も知りません。返されるDateオブジェクトは、それがCalendar.getTime()どのタイムゾーンに設定されているかを知りませんCalendar

オブジェクトを印刷するDateと (たとえば、暗黙のうちにtoString()object を呼び出すことによって)、それを実行しているマシンの既定のタイム ゾーンで書式設定されます。

Date特定のタイムゾーンでを印刷する場合は、 を使用SimpleDateFormatし、オブジェクトに目的のタイムゾーンを設定しSimpleDateFormatます。例えば:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
df.setTimeZone(TimeZone.getTimeZone("EDT"));

// Will display the date that the calendar is set to in the EDT timezone
System.out.println(df.format(cal.getTime()));
于 2014-01-14T21:25:26.463 に答える
0

Java Date オブジェクトは、1970 年 1 月 1 日 00:00:00 GMT からのミリ秒数を表します。これは、他のメソッドが推奨されていないためです。Date オブジェクトを直接「表示」する 2 つの方法は、「getTime()」と「toString()」です (「dow mon dd hh:mm:ss zzz yyyy」を使用)。したがって、GMT 値をローカル タイムゾーンにフォーマットしています。

日付を操作するときは、日付を GMT 値と考えてから、日付を表示するときの「書式設定」演習と考えるのが最善です。

于 2014-01-14T21:32:19.660 に答える
0

比較のために、 Joda-Time 2.3を使用した同じ種類のコードを次に示します。

java.util.Date & .Calendar クラスは避けてください。

タイム ゾーンに 3 文字のコードを使用しないでください。それらは標準化されておらず、独自のものでもありません。代わりに適切なタイムゾーン名を使用してください。この場合、「America/New_York」または「America/Montreal」を使用します。

// Use time zone names, such as from this slightly outdated list: http://joda-time.sourceforge.net/timezones.html
DateTimeZone timeZone = DateTimeZone.forID( "America/New_York" );

// Input.
int hour = 4, min = 0, sec = 0, ms = 64;

// Start with now, then adjust the time of day.
DateTime now = new DateTime( timeZone );
DateTime dateTime = now.withHourOfDay( hour ).withMinuteOfHour( min ).withSecondOfMinute( sec ).withMillisOfSecond( ms );

// If needed, translate to a java.util.Date for use with other classes.
java.util.Date date = dateTime.toDate();

コンソールにダンプ…</p>

System.out.println( "now: " + now );
System.out.println( "dateTime: " + dateTime );
System.out.println( "date: " + date );

実行すると…</p>

now: 2014-01-20T21:04:51.237-05:00
dateTime: 2014-01-20T04:00:00.064-05:00
date: Mon Jan 20 01:00:00 PST 2014
于 2014-01-21T02:06:44.793 に答える