我知道有很多关于转换java.util.Date
到java.util.Calendar
的问题,但是我花了几个小时试图解决我的问题,查看API和众多SO答案 - 因此我的问题。
我正在修改现有的JSP页面,该页面使用尚未更新的API来使用java.time API。并且要求传递的变量采用java.util.Calendar
格式。
我需要设置开始日期和结束日期,这应该是将来的14天。
我的开始日期很简单:
1. Calendar sd = Calendar.getInstance(); //this works
但我似乎无法生成未来14天的Calendar实例。我知道我可以设置以下内容:
2. sd.set(Calendar.Date, 14);
我很欣赏这可能是一个非常微不足道的问题 - 但我如何将其设置为单独的结束日期日历变量?
e.g. Calendar ed = ? //when set to statement 2 - I get a compile error
或者我是以完全错误的方式接近这个?
感谢。
答案 0 :(得分:3)
您只需使用add方法
即可add(Calendar.DAY_OF_MONTH, 14);
答案 1 :(得分:3)
GregorianCalendar.from( // Convert from modern java.time to legacy class.
LocalDate.now( // Get today’s date as it is now in this zone.
ZoneId.of( "America/Montreal" )
)
.plusDays( 14 )
.atStartOfDay( // Determine first moment of the day for this zone. Never assume 00:00:00.
ZoneId.of( "America/Montreal" )
) // Produces a `ZonedDateTime` object.
)
请注意,使用Calendar
的其他答案会忽略时区的关键问题。
你真的应该在java.time中做你的业务逻辑。传统的日期时间类如Calendar
是一个可怕的混乱。
如果必须使用麻烦的遗留类,例如使用尚未更新到java.tine类型的旧代码,请转换。 在java.time中工作,将结果转换为旧类。要转换,请查看添加到旧版类的新方法,例如valueOf
,to…
,from
。
确定今天的日期需要一个时区。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
添加14天(或2周)。
LocalDate ld = today.plusDays( 14 ) ; // .plusWeeks( 2 )
要从仅限日期转到日期时间(时间线上的特定时刻),我们必须指定一个时间。不要假设00:00:00。夏令时等异常表示该日可能会在其他时间开始,例如01:00:00。让java.time确定一天中的第一个时刻。
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
转换为旧版。
Calendar cal = GregorianCalendar.from( zdt ) ;
有关转换为/来自java.time的更多讨论和精美图表,请参阅类似问题的an Answer of mine。
答案 2 :(得分:1)
将结束Calendar
设置为新实例,然后提前约会。这将保留您的原始开始日期,然后提供新的结束日期Calendar
对象。
注意:如果可能的话,您应该在Java 8中查看新的日期/时间对象。
// get a new instance
Calendar ed = Calendar.getInstance();
// set to the starting time
ed.setTime(sd.getTime();
// advance the date by 14 days
ed.add(Calendar.DATE, 14);
答案 3 :(得分:0)
您应该使用add()
方法:
add(Calendar.DAY_OF_MONTH, 14);
更好的是,您可以使用Java SE 8 Date and Time APIs中的LocalDateTime
类:
LocalDateTime timePoint = LocalDateTime.now(); // The current date and time
timePoint.plusDays(14);
答案 4 :(得分:0)
即使您的API需要旧式Calendar
对象,您也可能更喜欢在自己的代码中使用现代日期和时间类,并且只在需要时转换为Calendar
。转换很简单(当你知道如何)。例如:
ZonedDateTime endDateTime = ZonedDateTime.now(ZoneId.systemDefault())
.plusDays(14);
Calendar ed = GregorianCalendar.from(endDateTime);
(您可能知道,GregorianCalendar
是抽象Calendar
类中最常用的子类。)