Java 将毫秒转换为日期时间会给出错误的时间

Java 将毫秒转换为日期时间会给出错误的时间,java,android,date,time,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); 这里是sHsM。。是

我想把一个很长的值转换成格式化时间。 我使用的代码是:

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.startTime
startTimeInSeconds

StartTime
是一个字符串

当我显示
StartTime
时,它没有给我正确的时间。
例如,当
startTimeInSeconds
2510823
时,它必须是
0:41:50823
,但我得到
1:41:50823

我不知道我做错了什么,如果我显示小时分钟。。。像这样:

int hours = (int) (SU.startTime / (60 * 60 * 1000));
然后我得到正确的值


有人知道这个问题的解决方案吗???

可能是您使用的时区。如果不指定日期格式,则默认值将提供给日期格式。

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

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

不幸的是,Java并没有合适的类型来涵盖这一点。你有
日期
日历
,两者都不合适。我建议您改为使用,您可以根据您的需求使用or类型,然后为该类型使用适当的格式化程序,这样您就不会遇到这个问题

Joda Time通常是一个更好的日期/时间处理API——我强烈建议您尽可能优先使用它,而不是Java API


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

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

Date包含一个时区-因此,如果您的时区为GMT+1(或-1,不确定),它将显示1:41而不是0:41。@assylias您又住在哪里了。;)可能是这个问题,我的时间僵尸是gmt+1,但如果我设置为gmt,小时是12,gmt-1的时间是11,在+1上是1,但哪里是零?:)@executioner:你使用的是
hh
,它给出了12小时的时钟。如果您想要24小时时钟(将给出00),您需要
HH
而不是
HH
。(我已将此编辑到我的答案中)我尝试了dateFormat.setTimeZone(TimeZone.getTimeZone(“GMT+00:00”);时间是12,1是11,等等。非常感谢你,改为HH并设置时区日期格式。setTimeZone(timezone.getTimeZone(“GMT”)成功了。@Execution:但是你明白我的意思了吗?在这里使用
SimpleDateFormat
Date
并不合适。我强烈建议您花一点时间进行更广泛的更改,以便从长远来看获得更大的好处。是的,谢谢您我将关注Joda time,稍后我将更改它,但首先我希望实现最常用的功能。优化将在稍后进行:)