Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每周、每小时及;分钟_Java_Java Time_Dayofweek_Datetime Parsing - Fatal编程技术网

Java 每周、每小时及;分钟

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

我试图从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 = 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,这样我就可以添加到日历中,或者也有使用库的短方法?谢谢