规则直到标签数据值

时间:2019-02-25 18:05:38

标签: java rrule

我正在一个项目,该项目需要有规则才能产生下一个事件。但是我不明白我需要在UNTIL的rrule标签中添加什么。

String str="RRULE:FREQ=MONTHLY;UNTIL=20190625T000000Z;INTERVAL=2;";

Idk如何将日期转换为"20190625T000000Z"。我正在使用rfc 2445 Java库。如果用户以字符串形式输入日期,例如:25/06/2019......,则需要如上所述在UNTIL标记中设置此值。如果我在UNTIL中设置默认值,那么它将起作用,但是当我将其设置为用户友好时将不起作用。.我将用户的所有值都用作开始日期,结束日期,间隔,Byday,Until ...但是idk是什么值在UNTIL中设置。 如果有人可以帮助..在此先感谢。

1 个答案:

答案 0 :(得分:0)

解析基本的ISO 8601格式

您的输入20190625T000000Z是标准ISO 8601格式的“基本”变体,以UTC表示时刻。 “基本”一词意味着最大程度地减少分隔符的使用(我不建议这样做,因为这会使字符串对人类的可读性降低)。

定义格式化模式以匹配输入。

String input = "20190625T000000Z";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuuMMdd'T'HHmmssX" );
OffsetDateTime odt = OffsetDateTime.parse( input , f );

转储到控制台。

System.out.println("odt.toString(): " + odt);

请参阅此code run live at IdeOne.com

  

odt.toString():2019-06-25T00:00Z

将日期转换为时刻

  

如果用户以字符串形式输入日期,例如:25/06/2019 ......我需要如上所述在UNTIL标签中设置此值

首先,将输入字符串解析为LocalDate,该字符串代表仅日期的值,没有日期和时区。

DateTimeFormatter fDateOnly = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
LocalDate ld = LocalDate.parse( "25/06/2019" , fDateOnly );
  

ld.toString():2019-06-25

关于将该日期转换为一个时刻(某个日期中具有一天中某个时间的日期或在某个距UTC的位置的日期),这比直观上要棘手。

诸如2019年6月25日这样的日期代表一整天。还有一个理论日期。一天开始和结束的时刻在全球各地时区有所不同。新的一天在日本东京比在法国巴黎早得多,甚至在蒙特利尔魁北克也开始。

另一个问题是,日期并非总是从00:00:00开始。由于诸如夏令时(DST)之类的异常,某些区域中某些日期的一天的第一时刻可能类似于01:00:00。让 java.time 类确定第一时刻。

ZoneId z = ZoneId.of( "Africa/Tunis" );
ZonedDateTime zdt = ld.atStartOfDay( z );
  

zdt.toString():2019-06-25T00:00 + 01:00 [非洲/突尼斯]

ZonedDateTime对象代表一个特定时刻。但是它使用的是特定地区(时区)的人们所采用的挂钟时间。您的目标是在UTC中度过片刻。幸运的是,我们可以通过转换为OffsetDateTime(日期和时间与UTC偏移,而不是时区)从UTC进行调整。我们可以通过ZoneOffset.UTC常量指定UTC(零偏移量)。

OffsetDateTime odt = zdt.toOffsetDateTime().withOffsetSameInstant( ZoneOffset.UTC );
  

odt.toString():2019-06-24T23:00Z

请注意,突尼斯25日00:00在世界标准时间24日“昨天”晚上11点。时间轴上的相同时刻,相同同时点,但是两个不同的时钟时间。

最后,我们需要使用“基本” ISO 8601格式的字符串。使用我们上面定义的相同格式器。

DateTimeFormatter fIso8601DateTimeBasic = DateTimeFormatter.ofPattern( "uuuuMMdd'T'HHmmssX" );
String output = odt.format( fIso8601DateTimeBasic );
  

输出:20190624T230000Z

请参阅此code run live at IdeOne.com

时区和UTC偏移量之间有什么区别?偏移量仅是小时-分钟-秒的数量。仅此而已,只是一个数字(三个数字)。时区更多。时区是特定区域的人们过去,现在和将来对偏移量的更改的历史记录。例如,在北美大部分地区,偏移量每年两次更改,先出现一个小时,然后又下降一个小时(Daylight Saving Time (DST)的谬误)。

提示:日期时间处理出奇的棘手和湿滑。如果您正在使用日历和iCalendar规范进行数据交换,建议您花一些时间来研究行业领先的 java.time 类的概念和实践。


关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore