在Java中执行日期和时间计算

时间:2012-03-01 13:46:27

标签: java date time

我正在尝试进行简单的日期/时间计算,无论我做什么,我都会对看似时区等问题感到困惑。

我需要一起添加(和减去)不同的日期/时间,所以我想最简单的方法是将它们转换为秒,执行计算然后格式化回字符串。但不管我做什么,我都要一小时出去 - 听起来像时区/ 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 马丁

7 个答案:

答案 0 :(得分:2)

为自己省去很多头痛,使用现有的库 - 我自己喜欢Joda Time

例如,DateTime类支持各种计算(添加或减去特定句点等)。如果您想要一个示例,请发布您的确切要求,然后我将其添加到答案中。

答案 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