我正在尝试在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时间?
答案 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类取代。
时区对于确定日期至关重要。 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 );