Java 每周、每小时及;分钟
我试图从XML加载一个类似于“MON 17:20”的计划字段 我想避免使用string replace e.t.c手动解析。我在线检查了这段代码Java 每周、每小时及;分钟,java,java-time,dayofweek,datetime-parsing,Java,Java Time,Dayofweek,Datetime Parsing,我试图从XML加载一个类似于“MON 17:20”的计划字段 我想避免使用string replace e.t.c手动解析。我在线检查了这段代码 final String dateInString = "Mon, 05 May 1980"; final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, d MMM yyyy", Locale.ENGLISH); final LocalDate dateTime = Lo
final String dateInString = "Mon, 05 May 1980";
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, d MMM yyyy", Locale.ENGLISH);
final LocalDate dateTime = LocalDate.parse(dateInString, formatter);
但是它没有week字段(我无法检索week)。有类似的短解析系统吗?试试这个
final String dateInString = "Thu Apr 30, 2020 17:20";
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd, yyyy HH:mm");
final LocalDateTime dateTime = LocalDateTime.parse(dateInString, formatter);
System.out.println(dateTime);
以上就是对此的分析
2020-04-30T17:20
如果你想要这一周,你可以这样做
System.out.println(dateTime.get(ChronoField.ALIGNED_WEEK_OF_MONTH));
System.out.println(dateTime.get(ChronoField.ALIGNED_WEEK_OF_YEAR));
印刷品
5
18
MON 17:20
更新答案
final String dateInString ="MON 17:20";
String[] vals = dateInString.split("\\s+");
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
final LocalTime dateTime = LocalTime.parse(vals[1], formatter);
System.out.println(vals[0] + " " + dateTime);
印刷品
5
18
MON 17:20
阅读查看该包以了解有关Java时态功能的更多信息。您需要将LocalDate对象传递到以下示例中: 那应该是给你的 从上面的链接中,在代码中传递“dateTime”字段,如
TemporalField woy = WeekFields.of(Locale.getDefault()).weekOfWeekBasedYear();
int weekNumber = dateTime.get(woy);
根据您的区域设置和该代码运行的地方,您可能需要考虑上面链接中提到的周刊.ISO。
< P>当然,java 8日期和时间API可能是./P> 您似乎有三个字段:一周中的一天、一天中的一小时和一小时中的一分钟。这通常可以使用格式字符串EEE HH:mm
使用DateTimeFormatter::of pattern
解析,但问题是MON
(在所有大写字母中)不是标准的;它应该是Mon
因此,我们需要使用DateTimeFormatterBuilder
构建格式化程序,指示应以不区分大小写的方式解析字符串:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("EEE HH:mm")
.toFormatter(Locale.ROOT);
唯一要做的就是使用
TemporalAccessor parsed = formatter.parse(elem);
现在,parsed
包含上述解析字段
约会
当然,您不必将其转换为实际日期。有许多用例不需要日期,而只需要一周中的一天和时间
但是,例如,如果您希望获取当前日期并将其调整为与计划中的数据相匹配,则可以执行以下操作:
TemporalAdjuster adj = TemporalAdjusters.nextOrSame(DayOfWeek.of(parsed.get(ChronoField.DAY_OF_WEEK)));
LocalDateTime now = LocalDate.now()
.atTime(LocalTime.from(parsed))
.with(adj);
问题不在于使用
DateTimeFormatter
解析很困难。问题是我们没有一个好的类型来解析。例如,该信息不适用于LocalDate
或LocalDateTime
。根据您对调度器的需求,我认为解决方案是解析成两个对象,而不是一个:一周中的一天和一天中的一个时间
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("EEE H:mm")
.toFormatter(Locale.ENGLISH);
String scheduleString = "MON 17:20";
TemporalAccessor parsed = formatter.parse(scheduleString);
DayOfWeek dow = DayOfWeek.from(parsed);
LocalTime time = LocalTime.from(parsed);
System.out.format("Schedule: every %s at %s", dow, time);
输出:
时间表:每周一17:20
显式使用
TemporalAccessor
接口被认为是低级的,但我更喜欢这种解决方案,而不是String.replace()
或String.split()
。如果要避免使用低级接口,只需将字符串解析两次,一次解析为DayOfWeek
,一次解析为LocalTime
应该是什么年和月?应该解析为什么日期MON 17:20
?哪一个星期一?我的代码基本上安排了每周X天的特定时间。所以我的xml字段是这样的,每周重复一次。我不需要解析月份或年份。所以基本上我做了一个“拆分”,“并将该日程表中的所有日期解析为下一个可用的日程表。@KbantikiMixaniki-如果没有年份和月份,就不可能计算出这个Mon
或Tue
属于哪个星期。你的意思是从当前日期开始吗?@KbantikiMixaniki你想对一周中的某一天和时间做什么?你想把它和一年和一个月,或者一年和一周的数字结合起来吗?你好,先生。谢谢你的回复。我尝试了以下操作:final String dateInString=“Thu 17:20”;final DateTimeFormatter formatter=模式的DateTimeFormatter.of(“EEE HH:mm”);但它给出了错误。我只需要分析一周中的哪一天和哪一天的时间,但似乎我做得不对?所以除了手动拆分和替换外,我没有其他选择,对吗?这是我的代码,目前为止基于您的示例:您觉得还好吗?我还需要做一个静态的方法来转换短周到int,这样我就可以添加到日历中,或者也有使用库的短方法?谢谢