设置java.util.Calendar未来日期

时间:2017-05-23 16:44:00

标签: java date calendar

我知道有很多关于转换java.util.Datejava.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

或者我是以完全错误的方式接近这个?

感谢。

5 个答案:

答案 0 :(得分:3)

您只需使用add方法

即可
add(Calendar.DAY_OF_MONTH, 14);

答案 1 :(得分:3)

TL;博士

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

真的应该在java.time中做你的业务逻辑。传统的日期时间类如Calendar是一个可怕的混乱。

如果必须使用麻烦的遗留类,例如使用尚未更新到java.tine类型的旧代码,请转换。 在java.time中工作,将结果转换为旧类。要转换,请查看添加到旧版类的新方法,例如valueOfto…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类中最常用的子类。)

相关问题