4

Java で約 15 年の経験がありますが、日付と時刻の処理のトピックには常につまずきます...

状況は次のとおりですString。表現として、外部システムからタイムスタンプを取得します。タイムスタンプのセマンティックは、UTC 日付を表すことです。このタイムスタンプは、エンティティに配置してから、PostgreSQL データベースのTIMESTAMPフィールドに配置する必要があります。さらに、現地時間 (私の場合は CEST) と同じタイムスタンプをエンティティに入れ、次にデータベースのTIMESTAMP WITH TIME ZONEフィールドに入れる必要があります。

コードを実行するマシンの設定に関係なく、タイムスタンプがエンティティ (他の UTC タイムスタンプでいくつかの検証を行うため) およびデータベース (後でレポートで使用するため) に正しく保存されるようにする正しい方法は何ですか?の上)?

これが私のローカル マシンで問題なく動作するコードです。

SimpleDateFormat sdfUTC = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
sdfUTC.setTimeZone(TimeZone.getTimeZone("UTC"));
Date utcTimestamp = sdfUTC.parse(utcTimestampString);
// getMachinesTimezone is some internal util method giving the TimeZone object of the machines Location
Calendar localTimestamp = new GregorianCalendar(getMachinesTimezone());
localTimestamp.setTimeInMillis(utcTimestamp.getTime());

しかし、サーバー上で同じコードを実行すると、異なる時間が発生したため、正しい処理方法ではないと思います。助言がありますか?

PS: このフォーラムで検索したときに Joda Time について読みましたが、指定されたプロジェクトでは、既存のモジュールを変更しただけなので新しいライブラリを導入できず、標準の JDK1.6 を使用する必要があります。

4

3 に答える 3

6

私の理解が正しければ、印刷するのと同じデータ/カレンダー オブジェクトにタイムゾーンを設定する必要があります。このような:

private Locale locale = Locale.US;
private static final String[] tzStrings = {
    "America/New_York",
    "America/Chicago",
    "America/Denver",
    "America/Los_Angeles",
};

  Date now = new Date();
  for ( TimeZone z : zones) {
        DateFormat df = new SimpleDateFormat("K:mm a,z", locale);
        df.setTimeZone(z);
        String result = df.format(now);
        System.out.println(result); 
  }

タイムゾーンを SimpleDateFormat に設定すると、正常に動作します。

これがサンプルコードです...

String date="05/19/2008 04:30 AM (EST)";
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm aaa (z)");
TimeZone.setDefault(TimeZone.getTimeZone("PST"));
long millis = sdf.parse(date).getTime();
sdf.setTimeZone(TimeZone.getDefault());
System.out.println(sdf.format(new Date(millis)));
于 2012-05-11T05:22:14.693 に答える
0

カレンダーオブジェクトでターゲットタイムゾーンを設定する必要があると思います。私は次のようなものだと思います:

Calendar localTimestamp = new GregorianCalendar(TimeZone.getTimeZone("GMT+10"));
localTimestamp.setTimeInMillis(utcTimestamp.getTime());

それ以外の場合、JavaはCalendarインスタンスのデフォルトのシステムタイムゾーンを使用します。

于 2012-05-11T05:13:47.373 に答える
-1

以下のサンプルコードでそれを行うことができます。

Date date = new Date();

DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");
formatter.setTimeZone(TimeZone.getTimeZone("CET"));

Date date1 = dateformat.parse(formatter.format(date));

// Set the formatter to use a different timezone
formatter.setTimeZone(TimeZone.getTimeZone("IST"));

Date date2 = dateformat.parse(formatter.format(date)); 
// Prints the date in the IST timezone
//    System.out.println(formatter.format(date));
于 2012-05-11T05:42:08.110 に答える