查看以下命令:
$ 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>
谢谢!这应该是这么难......
答案 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();