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?
解决方案
什么毫秒?您在第一个示例中仅提供分钟信息,而您的第二个示例以毫秒为单位从系统中获取当前日期,您在寻找什么?
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 以来的毫秒数。因此“06-04-2007 07:05”-“01-01-1970 00:00”等于 1180955340000 毫秒。由于您的问题唯一关心的是日期的时间部分,因此计算此计算的粗略方法是 07:05 到 00:00 之间的毫秒数,即 25500000。由于这两个时间都没有毫秒,所以它可以被 1000 整除。
在第二个日期中,它使用执行该行代码的当前时间。这将使用计算中当前秒数之后的当前毫秒数。因此,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);
}
}