给定基准日期后,如何在 Java 中动态创建日期字段?

How to dynamically create date fields in Java when given a base date to start from?

我有以下 Java POJO:

public class Meeting {

    private String id;

    private String startDateAndTime;

    private String endDateAndTime;

    private int recurrenceTimes;

    private String reccurenceType;

    //getters and setters etc

}

这本质上是会议的高级视图。即:

Meeting Id
First startDateAndTime
First endDateAndTime
How often it reccurs: recurrenceTimes
Recurrence Type: I.e. daily weekly etc

我想将此 object 分解为一系列单独的会议,即如果重复次数为 5 且类型为 "daily",则第一个 object 将包含原始开始和结束日期和时间以及随后的 4 个时间将动态 生成在同一时间,但它们的开始和结束日期和时间将在之后的日子。

最好的方法是什么?

我从 looping 的循环次数开始逻辑,但我对如何创建后续结构感到困惑

int recurrenceTimes= meeting.getRecurrenceTimes;

 //Create Single Meeting Objects
                for(int i=0; i<=recurrenceTimes i++){

                    String firstStartDate = meeting.getStartDate();
                    String firstEndDate = meeting.getEndDate();

                    //logic to create the subsqeuent Meeting Objects


                }

使用java.time

使用 java.time classes 进行此类日期时间工作。

LocalDateTime start = LocalDateTime.of( 2017 , Month.March , 27 ) ;

为您的重复类型定义一个 Enum。如果不熟悉 Java 非常有用的枚举工具,请参阅 Oracle Tutorial

public enum Recurrence {
    DAILY , WEEKLY , MONTHLY , QUARTERLY , YEARLY  
}

在您的代码中使用这些枚举对象。

if( Recurrence.WEEKLY.equals( meeting.recur ) ) {
    LocalDateTime ldt = start.plusWeeks( n ) ;

请注意,您不需要结束日期时间。一个开始加上多次重复意味着结束。所以不需要存储它。如果您需要在您的应用程序中出于其他目的使用该结尾,那么当然可以计算并存储它。

所以你的 class 看起来像这样。

public class Meeting {
    private UUID id ;  // java.util.UUID.randomUUID()
    private LocalDateTime start ;
    private Recurrence recur ;  // Stores an object from your own Enum defining DAILY, WEEKLY, etc.
    private Integer limit ; // The number of times this event recurs.
}

List 中收集您的结果。

List<LocalDateTime> list = new ArrayList<>() ;

……和……

list.add( ldt ) ;

那些 LocalDateTime 对象没有时区或与 UTC 的偏移量的概念。所以他们 而不是 代表时间轴上的特定时刻。

为此,您必须应用时区来赋予它们意义。如果该地区该日期的那个时间无效,则会自动进行调整。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( z );

关于 java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

从哪里获得java.time classes?

  • Java SE 8, Java SE 9,及以后
    • 内置。
    • 标准 Java API 的一部分,带有捆绑实施。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6 and Java SE 7
    • java.time 中的大部分功能已向后移植到 ThreeTen-Backport 中的 Java 6 和 7。
  • Android
    • ThreeTenABP 项目专门为 Android 改编了 ThreeTen-Backport(上面提到的)。
    • 参见

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.