2

私は日付文字列を持っています1/1/1970 8:00 AM

正しいミリ秒は8 hours * 60 minutes per hour * 60000 milliseconds per minute = 28800000

ただし、Date.parse(dateString)リターンを使用する50400000

私は何を理解していませんか?

編集

私はもともと date.getTime(); を使ってみました。

これが私の元のコードです:

SimpleDateFormat dateFmt = new SimpleDateFormat("MM/dd/yyyy h:mm a");
dateFmt.setTimeZone(TimeZone.getTimeZone("UTC"));
StringBuilder sb = new StringBuilder();                     
sb.append(month).append("/");
sb.append(day).append("/");
sb.append(year).append(" ");
sb.append(pad(hour)).append(":");
sb.append(pad(minute)).append(" ");;
sb.append(ampm);
Date date = new Date();

date = dateFmt.parse(sb.toString());

date.getTime()
4

3 に答える 3

7

これはほぼ間違いなく問題です。

タイム ゾーンが指定されていない場合は、ローカル タイム ゾーンが想定されます。

私の推測では、Unix エポックでは UTC-6 のタイム ゾーンにいるので、現地時間の午前 8 時は UTC 午後 2 時でした。

SimpleDateFormat次に、より良い代替手段(タイムゾーンを設定できる)が利用可能な場合に、非推奨の方法を使用するというより根本的な問題があります。メソッドは何らかの理由で廃止されています。廃止されたメソッドをそのまま使用するべきではありません。

実際、可能であればJoda Timeを使用したほうがよいでしょうが、少なくともDate.

サンプルコード:

SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy h:mm aa", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("UTC"));
long millis = format.parse(text).getTime();

日付の形式によっては、に変更することをお勧めしdd/MMますMM/dd。「01/01」とは判断できません。タイムゾーンとロケールの両方が明示的に設定されていることに注意してください。

于 2012-10-25T18:04:08.303 に答える
1

それはあなたのローカルタイムゾーンのためです。UTC以下のようにタイムゾーンで単純な日付形式を使用して、タイムゾーンに対して目的の値を取得します。

    DateFormat format = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
    String dateS = "1/1/1970 8:00 AM";
    format.setTimeZone(TimeZone.getTimeZone("UTC"));  
    format.setLenient(true);
    Date date = format.parse(dateS);
    System.out.println(date.getTime()); //<-- prints 28800000

またはよりコンパクト:

    DateFormat format = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
    format.setTimeZone(TimeZone.getTimeZone("UTC"));  
    Date date = format.parse("1/1/1970 8:00 AM");
    System.out.println(date.getTime());  //<-- prints 28800000
于 2012-10-25T18:17:54.257 に答える