我正在一个项目,该项目需要有规则才能产生下一个事件。但是我不明白我需要在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中设置。
如果有人可以帮助..在此先感谢。
答案 0 :(得分:0)
您的输入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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。