在Linux环境中计算Java中的分钟直到午夜

时间:2014-10-13 22:46:40

标签: java linux date calendar

查看以下命令:

$ sudo ln -fs /usr/share/zoneinfo/US/Pacific localtime
$ date
Mon Oct 13 15:29:02 PDT 2014
$ sudo ln -fs /usr/share/zoneinfo/US/Hawaii localtime
$ date
Mon Oct 13 12:29:20 HST 2014

这一切都很好。现在我有一些用java编写的软件,它需要知道午夜到几分钟,所以它可以执行一些维护。

以下是我提出的代码:

// Time to perform maintenance
String rawTime = "23:59";
int hours = Integer.parseInt(rawTime.substring(0, 2));
int minutes = Integer.parseInt(rawTime.substring(3, 5));

// Get current Time
Calendar c = Calendar.getInstance();
long now = c.getTimeInMillis();
Date dateNow = new Date(now);
System.out.println(new Date(now));

// Get midnight
c.set(Calendar.HOUR_OF_DAY, hours);
c.set(Calendar.MINUTE, minutes);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
Date midnight = new Date(c.getTimeInMillis());

// Get Difference
System.out.println(String.format("Calc minutes from %s to %s", dateNow, midnight));       
long result = ((midnight.getTime()/60000) - (dateNow.getTime()/60000));
System.out.println((int) result);

将linux设置为夏威夷时区时的输出:

Calc minutes from Mon Oct 13 15:36:51 PDT 2014 to Mon Oct 13 23:59:00 PDT 2014
Result:  503

正如你所看到的,我没有得到正确的时间......我正在接受PDT而不是HST。我不关心为什么toString()的日期返回PDT,因为它与时区无关,但我关心的是我应该如何计算它?

让我们从'11:59'开始计算,直到'11:59'为linux认为时间是多少分钟......我愿意接受一个解决方案,我以不同的方式设置linux时间。< / p>

谢谢!这应该是这么难......

1 个答案:

答案 0 :(得分:0)

java.util.Date和.Calendar类非常麻烦。避免他们。在Java 8中使用Joda-Time或新的java.time包。

在Joda-Time和java.time中,日期时间对象确实知道自己指定的时区(与java.util.Date不同)。

以下是Joda-Time 2.5中的一些示例代码。

DateTimeZone timeZoneHawaii = DateTimeZone.forID( "Pacific/Honolulu" );
DateTime now = DateTime.now( timeZoneHawaii );
DateTime dayStart = now.plusDays(1).withTimeAtStartOfDay();  // Usually 00:00:00.000 but not always because of Daylight Saving Time or possibly other anomalies.
int minutesUntilDayStartsInHawaii = Minutes.minutesBetween( now, dayStart ).getMinutes();