0

ISTに日時があります。Javaで指定された日時に夏時間があれば、夏時間を考慮して入力に基づいて米国のタイムゾーンに変換したいと思います。これは私が試したものです

function convert(Date dt,int toTimeZoneId){
Calendar cal = Calendar.getInstance();
cal.setTime(dt); // Geting time in IST

//Converted to GMT and set in cal

switch(toTimeZoneId){
    case 1: tzTarget = TimeZone.getTimeZone("America/Adak"); 
        offset = -10;
        break;
    case 2: tzTarget = TimeZone.getTimeZone("America/Anchorage"); 
        offset = -9;
        break;
    case 3: tzTarget = TimeZone.getTimeZone("America/Los_Angeles"); 
        offset = -8;
        break;

    case 4: tzTarget = TimeZone.getTimeZone("America/Denver");
        offset = -7;
        break;
    case 5: tzTarget = TimeZone.getTimeZone("America/Chicago");
        offset = -6;
        break;
    case 6: tzTarget = TimeZone.getTimeZone("America/New_York");
        offset = -5;
        break;
}
//converting from GMT to US timezones based on offset and dst
cal.setTimeZone(tzTarget);
dst = tzTarget.getDSTSavings();
dst = dst/3600000;
offset = offset + dst;
cal.add(Calendar.HOUR, offset);

Date date = cal.getTime();

System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date));

}

4

3 に答える 3

1

特定の日付を別のタイムゾーンに変換するには、適切なタイムゾーンで日付フォーマッターを作成する必要があります。日付インスタンスは、エポックに比べて単なる長い値です。タイムゾーン情報はありません。したがって、別のタイムゾーンに変換するのではなく、別のタイムゾーンで表すだけです。そのため、日付インスタンスの文字列表現を作成するときにタイムゾーン情報が必要になります。

上記を説明するためのコードを次に示します。わかりやすくするために、日付形式の文字列にタイムゾーンを追加しました。

/*
 * Converts a specified time to different time zones
 */
public void convert(Date dt) {
    // This prints: Date with default formatter: 2013-03-14 22:00:12 PDT
    // As my machine is in PDT time zone
    System.out.println("Date with default formatter: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z").format(dt));

    // This prints: Date with IST time zone formatter: 2013-03-15 10:30:12 GMT+05:30
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
    TimeZone tz = TimeZone.getTimeZone("GMT+0530");
    sdf.setTimeZone(tz);
    String dateIST = sdf.format(dt);
    System.out.println("Date with IST time zone formatter: " + dateIST);

    // This prints: Date CST time zone formatter: 2013-03-15 00:00:12 CDT        
    tz = TimeZone.getTimeZone("CST");
    sdf.setTimeZone(tz);
    System.out.println("Date CST time zone formatter: " + sdf.format(dt));
}

これがあなたがやろうとしていることだと思います-与えられた時間を別のタイムゾーンに変換します。これを行うには、オフセットを加算/減算する必要はないと思います。同じ時間を別のタイムゾーンで表示するだけTimeZoneで、フォーマット中にインスタンスがそれを処理できる必要があるためです。

夏時間調整に関しては、それTimeZoneも処理できるはずです。私のサンプルコードでお気づきの方もいらっしゃると思いますが、私はインスタンスのCST作成に使用しており、 「GMT-06時間」です。ただし、このタイムゾーンインスタンスは夏時間を使用しているため、出力は「GMT-05時間」になります。したがって、適切なタイムゾーンを使用することで、夏時間も処理できるはずです。TimeZoneCSTCDT

于 2013-03-14T12:52:58.130 に答える
0

java.util.GregorianCalendarを使用すると、タイムゾーンを使用して日付を作成できます。残念ながら、足し算と引き算はそこから吸い込まれます。(Javaで日付をどのように減算しますか?

2つのタイムゾーン間で変換しているため、java.util.TimeZoneを使用して、の差を使用することもできますtz1.getOffset(date) - tz2.getOffset(date)。減算を行うときは、順序に注意してください。

于 2013-03-14T12:10:25.103 に答える
0

ジョーダタイム

Joda-Timeを使用すると、これがはるかに簡単になります。または、Java8で新しいjava.timeパッケージを試してください。

Joda-Time2.3を使用したサンプルコードを次に示します。さらに多くの例については、StackOverflowを検索してください。

インドの時間…</p>

DateTimeZone timeZone_India = DateTimeZone.forID( "Asia/Kolkata" );
DateTime dateTimeIndia = new DateTime( date, timeZone_India );

ニューヨーク時間と同じ表示の瞬間を調整しています…</p>

DateTimeZone timeZone_NewYork = DateTimeZone.forID( "America/New_York" );
DateTime dateTimeNewYork = dateTimeIndia.withZone( timeZone_NewYork ); // Same moment, different wall-clock time.

それでも同じ瞬間ですが、UTC(タイムゾーンオフセットなし)です。

DateTime dateTimeUtc = dateTimeIndia.withZone( DateTimeZone.UTC );

適切なタイムゾーン名を使用する

3〜4文字のタイムゾーンコードの使用は避けてください。それらは標準化されておらず、一意でもありません。たとえばIST、アイルランドの標準時またはインドの標準時のいずれかを意味する場合があります。適切なタイムゾーン名を使用してください。

于 2014-03-24T07:34:49.147 に答える