Java日历 - 设置自定义日期和时间

时间:2016-07-02 07:55:17

标签: java calendar

我正在尝试在java中为Calendar对象设置自定义日期和时间。我必须创建一个比当前日期多1天的日期,时间应设置为“X”(有些时间如05:00:00)。

以下是我到目前为止所做的事情:

Calendar tomorrow = Calendar.getInstance();
tomorrow.add(Calendar.DATE, 1);

wake_up_time = "05:00:00";

Date date_wake_up_time = new SimpleDateFormat("HH:mm:ss").parse(wake_up_time);
Calendar cal_wake_up_time = Calendar.getInstance();
cal_wake_up_time.setTime(date_wake_up_time);

tomorrow.set(Calendar.HOUR, cal_wake_up_time.get(Calendar.HOUR));
tomorrow.set(Calendar.MINUTE, cal_wake_up_time.get(Calendar.MINUTE));
tomorrow.set(Calendar.SECOND, cal_wake_up_time.get(Calendar.SECOND));

现在当我做tomorrow.getTimeInMillis()时,我应该得到一个恒定的长值,因为在某一天,我将时间设置为常数。但是,当我运行此代码时,长值不断变化。

Tomorrow Date: 3
Tomorrow Hour: 5
Tomorrow Minute: 0
Tomorrow Second: 0
Tomorrow's Time: 1467522000711

Tomorrow Date: 3
Tomorrow Hour: 5
Tomorrow Minute: 0
Tomorrow Second: 0
Tomorrow's Time: 1467522000169

以及更多,为什么每次迭代时间值会减少?我在这做错了什么?如何将日历设置为明天的X时间?

3 个答案:

答案 0 :(得分:1)

如果你这样做:

Calendar cal_wake_up_time = Calendar.getInstance();

然后,每次日历将存储不同的时间,因此您将拥有不同的毫秒值。

如果是,那么您需要清除未设置的值,方法是在开头使用clear()或使用clear(int field)按字段执行此操作(例如clear(Calendar.MILLISECOND)) :

tomorrow.clear(Calendar.MILLISECOND);

答案 1 :(得分:0)

问题中的代码工作得很好。问题是,我没有将Milliseconds设置为0或常量(tomorrow.set(Calendar.SECOND,0);)更改只有毫秒,我忽略了。这也让我假设每次执行代码时长值都在减少。

答案 2 :(得分:0)

java.time

您正在使用过时的类,现在已被java.time类取代。

时区

时区对于确定日期至关重要。 JVM的当前默认值可随时更改。因此,请始终明确指定所需/预期的时区。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );

Local…类没有时区。这些可以用作构建块来组合我们期望的“明天”和“早上5点”的值。

新的LocalTime对象默认为全零。因此无需清除分钟,秒和小秒。所以没有像Calendar使你绊倒的问题。

LocalDate tomorrow = now.toLocalDate().plusDays( 1 );
LocalTime fiveAm = LocalTime.of( 5 , 0 );
ZonedDateTime tomorrowAt0500 = ZonedDateTime.of( tomorrow , fiveAm , zoneId );

转换

如果必须在旧代码中使用java.util.Calendar对象,请从java.time类型转换。寻找添加到旧类的新方法。

java.util.Calendar cal = java.util.GregorianCalendar.from( tomorrowAt0500 );