0

MM/dd/yyyy解析している形式の日付文字列がありますSimpleDateFormat

ここで、以下のコード用であるstartDateStringと言います。11/26/2012タイムゾーンをAmerica/New_Yorkに設定しました

SimpleDateFormat df=new SimpleDateFormat("MM/dd/yyyy");

Date st = df.parse(startDateString);

Calendar startDate = Calendar.getInstance(TimeZone.getTimeZone("America/New_York"));

System.out.println("BEFORE : Start Date :"+startDate.getTime());

startDate.setTime(st);

System.out.println("AFTER : Start Date :"+startDate.getTime());

DateTimeZone timezone = DateTimeZone.forID("America/New_York");

DateTime actualStartDate = new DateTime(startDate,timezone);

System.out.println("JODA DATE TIME "+ actualStartDate);

上記のコードスニペットの概要:

BEFORE : Start Date :Tue Nov 27 12:26:51 IST 2012

AFTER : Start Date :Mon Nov 26 00:00:00 IST 2012 //ok it sets date to 26th
                                                 //with all time parameters as 0.

JODA DATE TIME 2012-11-25T13:30:00.000-05:00 // here the date and 
                                             // time parameter are changed

actualStartDateがこのように作成するときの私の問題は何ですか:

DateTime actualStartDate = new DateTime(startDate,timezone);

日付が25に変更され、時刻が13:00:00
に変更されます。これは、インドと米国のタイムゾーンゾーンの違いによるものだと思います(ISTインド時間から合計-10:30)

私が欲しいのはJODA DATE TIME 2012-11-26T00:00:00.000-05:00

startDateカレンダーインスタンス内の時間のパラメータを手動で設定します0か?

4

1 に答える 1

3

問題は、デフォルトのタイムゾーンで解析していることだと思います。これ:

AFTER : Start Date :Mon Nov 26 00:00:00 IST 2012

使用している瞬間が真夜中のISTであることを示しています。ニューヨークや UTC の真夜中ではありません。現在、IST は UTC で 18:30 であるため、表現している瞬間は 25-11-25T18:30:00Z です。

これをニューヨーク時間に変換すると、2012-11-25T13:30:00-05:00 になります。これは、まさに Joda Time が行っていることです。

次のことを強くお勧めします。

  • Java ライブラリの使用をまったく避けます (ここからすべての問題が発生します。解析とDate.toString()混乱の結果の両方で発生します)。
  • LocalDateではなく、日付を表すために使用しDateTimeます。結局のところ、瞬間ではなく日付を表現しようとしています。日付にはタイムゾーンがないため、これはタイムゾーンを完全にバイパスします

サンプルコード:

import java.util.*;

import org.joda.time.*;
import org.joda.time.format.*;

public class Test {
    public static void main (String[] args) {
        String text = "11/26/2012";
        DateTimeFormatter formatter =
            DateTimeFormat.forPattern("MM/dd/yyyy")
                          .withLocale(Locale.US);

        LocalDate date = formatter.parseLocalDate(text);
        System.out.println(date);
    }    
}

を取得したらLocalDate、特定のタイム ゾーンでその日が始まった瞬間を知りたい場合は、 を使用できますLocalDate.toDateTimeAtStartOfDay(DateTimeZone)

于 2012-11-27T07:19:43.437 に答える