使用Date.parse(dateString)确定给定日期的Millis是错误的

Roy*_*ley 2 java date milliseconds

我有一个日期字符串 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()
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 7

这几乎肯定是问题所在:

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

我的猜测是你所处的时区是在Unix时代的UTC-6,所以当地时间早上8点是UTC时间.

然后,当有更好的替代方法(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();
Run Code Online (Sandbox Code Playgroud)

您可能想要更改dd/MMMM/dd,取决于您的日期将采用何种格式 - 我们无法从"01/01"判断.请注意时区和区域设置的显式设置.