将毫秒转换为Datetime会产生不正确的时间

时间:2013-01-25 10:37:00

标签: java android date time

我想要将长值转换为格式化时间。 我使用的代码:

long startTimeInSeconds = 60*60*1000*sH + 60*1000*sM + sS*1000 + sL;
SimpleDateFormat dateFormat = new SimpleDateFormat("hh:mm:ss,SSS");
Date start= new Date(SU.startTime);
StartTime = dateFormat.format(start);

此处sH sM ..是小时分钟..来自字符串,格式为:"hh:mm:ss,SSS"
SU.startTimestartTimeInSeconds StartTime是一个字符串。

当我显示StartTime时,它没有给我正确的时间 例如,当startTimeInSeconds2510823时,它必须为0:41:50,823,但我得到1:41:50,823
我不知道我做错了什么,如果我显示小时分钟......就像这样:

int hours = (int) (SU.startTime / (60 * 60 * 1000));

然后我得到正确的值。

有谁知道这个问题的解决方案是什么?

4 个答案:

答案 0 :(得分:6)

我的猜测是你在英国或法国,1970年1月1日的时区是GMT + 1。如果您将时区设置为“GMT”,则不会出现此问题。

答案 1 :(得分:5)

通过指定时区可以解决当前问题,正如其他人所建议的那样。但是,更微妙的问题是您使用的是不合适的类型。你有一个持续时间,通过它的声音 - 或可能一天中的时间;目前还不清楚。如果您可以使用正确的类型,那么时区不应该涉及 - 毕竟,“以秒为单位的开始时间”在逻辑上没有与之相关的时区。

不幸的是,Java并没有真正的类型来涵盖这一点。您有DateCalendar,两者都不合适。我建议您改用Joda Time,根据您的要求使用DurationLocalTime类型 - 然后为该类型使用适当的格式化程序,而不是遇到这个问题。

Joda Time是一个更好的日期/时间处理API - 我强烈建议您尽可能优先使用Java API。

编辑:正如评论中所述,您还需要格式字符串中的HH而不是hh,因为您希望24小时制以将午夜显示为00而不是12。

答案 2 :(得分:1)

可能是您使用的TimeZone的情况。如果您没有指定,则默认提供给DateFormat。

答案 3 :(得分:0)

您最好开始使用日历而不是日期。你需要对此进行一些研究。