Java 使用date.parse(dateString)表示给定日期的毫秒是错误的

Java 使用date.parse(dateString)表示给定日期的毫秒是错误的,java,date,milliseconds,Java,Date,Milliseconds,我有一个日期字符串1970年1月1日上午8:00 正确的毫秒应为8小时*60分钟/小时*60000毫秒/分钟=2880000 但是,使用Date.parse(dateString)返回5040000 我不明白什么 编辑 我最初尝试使用date.getTime() 这是我的原始代码: SimpleDateFormat dateFmt = new SimpleDateFormat("MM/dd/yyyy h:mm a"); dateFmt.setTimeZone(TimeZone.getTimeZo

我有一个日期字符串
1970年1月1日上午8:00

正确的毫秒应为
8小时*60分钟/小时*60000毫秒/分钟=2880000

但是,使用
Date.parse(dateString)
返回
5040000

我不明白什么

编辑

我最初尝试使用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()

这几乎肯定是问题所在:

如果未指定时区,则假定为本地时区

我猜您所在的时区在Unix时代是UTC-6,所以当地时间上午8点是UTC下午2点

还有一个更根本的问题是,如果有更好的替代方法(
SimpleDateFormat
,它允许您设置时区)可用,则使用不推荐的方法。方法被弃用是有原因的。无论如何,您不应该只使用不推荐的方法,否则您将继续遇到类似的情况

事实上,如果可能的话,您最好使用这些方法,但至少不要使用
Date
中不推荐的方法

示例代码:

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

根据日期的格式,您可能需要将日/日更改为日/日-我们无法从“01/01”中分辨出来。请注意时区和区域设置的显式设置。

这是因为您的本地时区。使用简单的日期格式和时区,如下所示,根据
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格式=新的SimpleDataFormat(“MM/dd/yyyy hh:MM a”);
字符串日期=“1970年1月1日上午8:00”;
format.setTimeZone(TimeZone.getTimeZone(“UTC”));
格式。setLenient(true);
日期=format.parse(日期);

System.out.println(date.getTime())//为什么要使用不推荐的
Date.parse()
?SimpleDataFormat返回一个日期对象,我希望它是一个长的。请告诉我如何使用您推荐的方法完成此操作,谢谢+1@Jon双向飞碟。但你可以试着告诉他住在哪里,而不是告诉他那些信息。”你怎么知道的?':-)@AndroidAddict:
Date.getTime()
也许吧?(事实上,阅读文档并不难做到这一点……)我也使用了这种方法,但仍然得到了相同的结果。请给我举个例子。另外,请保持你的评论具有建设性,因为可能是你不理解某些东西。@Android上瘾者:Jon Skeet不理解某些东西?真有趣。
    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