Date.getTime() には時間が含まれていませんか?
質問
なぜ次のようなことが起こるのか理解できません:
String date = "06-04-2007 07:05";
SimpleDateFormat fmt = new SimpleDateFormat("MM-dd-yyyy HH:mm");
Date myDate = fmt.parse(date);
System.out.println(myDate); //Mon Jun 04 07:05:00 EDT 2007
long timestamp = myDate.getTime();
System.out.println(timestamp); //1180955100000 -- where are the milliseconds?
// on the other hand...
myDate = new Date();
System.out.println(myDate); //Tue Sep 16 13:02:44 EDT 2008
timestamp = myDate.getTime();
System.out.println(timestamp); //1221584564703 -- why, oh, why?
解決
何ミリ秒ですか?最初の例では分の情報のみを提供していますが、2 番目の例ではシステムから現在の日付をミリ秒単位で取得します。何を探しているのでしょうか?
String date = "06-04-2007 07:05:00.999";
SimpleDateFormat fmt = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss.S");
Date myDate = fmt.parse(date);
System.out.println(myDate);
long timestamp = myDate.getTime();
System.out.println(timestamp);
他のヒント
上記に同意します。ミリ秒は存在しないはずです。。。
指定した単純な日付形式ではミリ秒が無視されるためです。したがって、結果として得られる Date オブジェクトにはその情報がありません。したがって、印刷するとすべて 0 になります。
一方、Date オブジェクトにミリ秒の値を割り当てた場合 (この場合は new Date() を使用)、Date オブジェクトはミリ秒を保持します。したがって、印刷するとミリ秒も含まれます。
Sun JDK の時刻/日付ライブラリ (これには多くの要望が残されています) を使用する代わりに、以下を検討することをお勧めします。 http://joda-time.sourceforge.net.
これは非常に成熟したアクティブなsourceforgeプロジェクトであり、非常にエレガントなAPIを備えています。
日付を解析するときは、指定された情報のみが使用されます。この場合、MM-dd-yyyy HH:mm のみが認識されます。
新しい日付オブジェクトを作成すると、現在のシステム日付/時刻 (エポックからのミリ秒数) が返されます。
Date オブジェクトの toString() ではミリ秒が表示されません...でも彼らはそこにいる
したがって、 new Date() は、次のようにミリ秒の解像度を持つオブジェクトです。
System.out.printf( "ms = %d\n", myDate.getTime() % 1000 ) ;
ただし、SimpleDateFormat を使用して日付を作成する場合、ミリ秒は渡されません。
ここの質問が抜けているのでしょうか?
[編集] ハハハ...遅すぎる ;)
Date.getTime は、Date オブジェクトで表される 1970 年 1 月 1 日 00:00:00 GMT からのミリ秒数を返します。したがって、「2007 年 6 月 4 日 07:05」 - 「1970 年 1 月 1 日 00:00」は 1180955340000 ミリ秒に相当します。あなたの質問の唯一の関心事は日付の時間部分に関するものであるため、この計算の大まかな考え方は、07:05 と 00:00 の間のミリ秒数、つまり 25500000 です。どちらの時間もミリ秒を持たないため、これは 1000 で均等に割り切れます。
2 番目の日付では、そのコード行が実行されたときの現在時刻が使用されます。これにより、現在の秒から現在のミリ秒が計算に使用されます。したがって、Date.getTime は 1000 で割り切れない数値を返す可能性が高くなります。
の getTime()
の方法 Date
1970 年 1 月 1 日からのミリ秒数を返します (すべてのコンピューターの日付はこの日付に基づいているため、この日付は「エポック」と呼ばれます)。それはすべきです ない 人間が読めるバージョンの日付を表示するために使用されます。
使用 SimpleDateFormat.format()
代わりにメソッドを使用します。これは、問題を解決できると思われるコードの一部の改訂版です。
String date = "06-04-2007 07:05:23:123";
SimpleDateFormat fmt = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss:S");
Date myDate = fmt.parse(date);
System.out.println(myDate); //Mon Jun 04 07:05:23 EDT 2007
String formattedDate = fmt.format(myDate);
System.out.println(formattedDate); //06-04-2007 07:05:23:123
import java.util.*;
public class Time {
public static void main(String[] args) {
Long l = 0L;
Calendar c = Calendar.getInstance();
//milli sec part of current time
l = c.getTimeInMillis() % 1000;
//current time without millisec
StringBuffer sb = new StringBuffer(c.getTime().toString());
//millisec in string
String s = ":" + l.toString();
//insert at right place
sb.insert(19, s);
//ENJOY
System.out.println(sb);
}
}