我正在尝试进行简单的日期/时间计算,无论我做什么,我都会对看似时区等问题感到困惑。
我需要一起添加(和减去)不同的日期/时间,所以我想最简单的方法是将它们转换为秒,执行计算然后格式化回字符串。但不管我做什么,我都要一小时出去 - 听起来像时区/ DST等。
这有什么问题:
long dateInMillis = 3600000L;
DateFormat formatter = new SimpleDateFormat("HH:mm");
Date dt = new Date();
dt.setTime(dateInMillis);
System.out.println( formatter.format(dt.getTime()));
我得到的答案是凌晨2点。即使我使用:
long dateInMillis = 1;
我仍然得到1点
请帮助; - )
TIA 马丁
答案 0 :(得分:2)
答案 1 :(得分:2)
我同意使用Joda可能会让生活更轻松。然而,您所看到的是TimeZone敏感格式化程序的效果。
您可以尝试添加:
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
答案 2 :(得分:0)
您不应该尝试将长期格式化为日期。只需使用:
long dateInMillis = 3600000L;
DateFormat formatter = new SimpleDateFormat("HH:mm");
Date dt = new Date();
dt.setTime(dateInMillis);
System.out.println( formatter.format(dt));
但是,如果您的计算无论如何都很复杂,我会使用第三方库来处理像JodaTime这样的时间计算,如果你的计算很复杂。
答案 3 :(得分:0)
我还建议使用评论中建议的框架。
但是,Date是基于1970年1月1日之后的毫秒数。所以3600000L距离那里只有一个小时,所以1点是正确的。
答案 4 :(得分:0)
根据此处的人员,您可以使用Joda Time来解决此计算问题。如果您希望使用纯Java代码,可以查找Calendar
类来执行日期操作。这是一个示例:
Calendar c = Calendar.getInstance();
DateFormat df = new SimpleDateFormat("HH:mm");
Date d = c.getTime();
System.out.println(df.format(d)); //actual hour:minute
c.add(Calendar.HOUR, -4);
d = c.getTime();
System.out.println(df.format(d)); //actual hour:minute minus 4 hours
但是,我不会过多地依赖这种代码。使用Joda Time时你会遇到更少的问题。
答案 5 :(得分:0)
当您致电new Date()
时,会创建当前时区的当前日期。当你调用'dt.setTime(dateInMillis);'时您在GMT时区中设置自1970年1月1日起以毫秒为单位的偏移量。让我解释一下,在Msk中,第一次调用会给我Thu Mar 01 17:02:22 MSK 2012
,第二次调用会给我1小时的偏移量,因此在Msk中它将是原始偏移量(+3)加1,所以它将是{ {1}}。然后,当您呼叫Thu Jan 01 04:00:00 MSK 1970
时,它会在内部调用formatter.format(? extends Number)
,因此会创建日期new Date(((Number)obj).longValue())
并打印小时和分钟。所以,你是对的,它打印出你当前时区的时间。
答案 6 :(得分:0)
对于后代,这里是使用Joda-Time 2.3库的示例代码,如其他答案和评论所述。
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;
long dateTimeInMillis = 3600000L; // 1,000 * 60 * 60 = 3600000L = 1 hour.
// Time Zone list… http://joda-time.sourceforge.net/timezones.html (not quite up-to-date, read page for details)
DateTime dateTimeInUtc = new DateTime( dateTimeInMillis, DateTimeZone.UTC );
// Paris happens to be one hour ahead of UTC/GMT.
DateTime dateTimeInParis = dateTimeInUtc.toDateTime( DateTimeZone.forID( "Europe/Paris" ) );
转储到控制台...
System.out.println( "dateTimeInUtc: " + dateTimeInUtc );
System.out.println( "dateTimeInParis: " + dateTimeInParis );
跑步时......
dateTimeInUtc: 1970-01-01T01:00:00.000Z
dateTimeInParis: 1970-01-01T02:00:00.000+01:00