标签: java-time

如何使用时间API检查字符串是否与日期模式匹配?

我的程序正在将输入字符串解析为LocalDate对象.在大多数情况下,字符串看起来像30.03.2014,但偶尔看起来像3/30/2014.根据具体情况,我需要使用不同的模式来调用DateTimeFormatter.ofPattern(String pattern).基本上,我需要检查字符串是否与模式匹配,dd.MM.yyyy或者M/dd/yyyy在进行解析之前.

正则表达式的方法类似于:

LocalDate date;
if (dateString.matches("^\\d?\\d/\\d{2}/\\d{4}$")) {
  date = LocalDate.parse(dateString, DateTimeFormatter.ofPattern("M/dd/yyyy"));  
} else {
  date = LocalDate.parse(dateString, DateTimeFormatter.ofPattern("dd.MM.yyyy"));  
}
Run Code Online (Sandbox Code Playgroud)

这有效,但在匹配字符串时使用日期模式字符串会很好.

有没有任何标准方法可以使用新的Java 8时间API执行此操作,而无需使用正则表达式匹配?我查看过文档,DateTimeFormatter但找不到任何内容.

java datetime-format datetime-parsing java-8 java-time

12
推荐指数
1
解决办法
2万
查看次数

如何在JSR 310中处理大写或小写?

如果一个月是UPPER或小写,即不是Title情况,则DateTimeFormatter无法解析日期.有一种简单的方法可以将日期转换为标题案例,还是一种使格式化程序更宽松的方法?

for (String date : "15-JAN-12, 15-Jan-12, 15-jan-12, 15-01-12".split(", ")) {
    try {
        System.out.println(date + " => " + LocalDate.parse(date,
                                     DateTimeFormatter.ofPattern("yy-MMM-dd")));
    } catch (Exception e) {
        System.out.println(date + " => " + e);
    }
}
Run Code Online (Sandbox Code Playgroud)

版画

15-JAN-12 => java.time.format.DateTimeParseException: Text '15-JAN-12' could not be parsed at index 3
15-Jan-12 => 2015-01-12
15-01-12 => java.time.format.DateTimeParseException: Text '15-01-12' could not be parsed at index 3
15-jan-12 => java.time.format.DateTimeParseException: Text '15-jan-12' could not be parsed at index 3
Run Code Online (Sandbox Code Playgroud)

java java-8 java-time

12
推荐指数
1
解决办法
1162
查看次数

如何在Java 8/JSR 310/threeten.org中处理ISO-8601时间戳中的'可选'T?

在Java 8时代/ JSR 310/threeten.org backport ...

问:如何在日期部分和时间部分之间用"T"或"空格"解析ISO-8601时间戳?

时间戳的ISO-8601格式指定文本"T"以将日期规范与时间规范分开:

2015-05-12T15:42:00.123
Run Code Online (Sandbox Code Playgroud)

许多应用程序以这种格式生成时间戳,空格为'char而不是'T'.参考文献表明ISO-8601通过相互协议允许这一点.

2015-05-12 15:42:00.123
Run Code Online (Sandbox Code Playgroud)

因为我从多个来源摄取数据,我想要允许'T'或空格''.

我观察到模式字符串允许指定可选组件,但我没有看到任何方式在模式字符串中指定"选择"...

问:有没有办法在JSR 310模式字符串中"选择一个完全一个"?

我能够通过构造一个带有两个可选模式的DateTimeFormatter来实现这个目的:

DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder()
    .appendOptional(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
    .optionalStart().appendPattern("yyyy-MM-dd HH:mm:ss.SSS").optionalEnd()
    .toFormatter();
Run Code Online (Sandbox Code Playgroud)

看到optionalStart()和optionalEnd()导致我:

DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder()
    .appendPattern("[yyyy-MM-dd HH:mm:ss.SSS][yyyy-MM-dd'T'HH:mm:ss.SSS]")
    .toFormatter();
Run Code Online (Sandbox Code Playgroud)

但是,我不相信这是处理这种情况的正确方法......

问:处理多个DateTime模式的最佳实践解决方案是什么?

提前致谢.

java datetime java-8 java-time

12
推荐指数
1
解决办法
2574
查看次数

在java.time中设置ZonedDateTime的时间?

如何更改现有ZonedDateTime对象的时间部分?我想保留日期和时区,但改变小时和分钟.

java java-time zoneddatetime

12
推荐指数
1
解决办法
7724
查看次数

Java8 DateTimeFormatter am/pm

我试图解析一些日期,但DateTimeParser似乎不同意我的有效期

import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
import java.util.Locale

ZonedDateTime.parse("Wed Jul 16, 2016 4:38pm EDT", DateTimeFormatter.ofPattern("EEE MMM dd, yyyy hh:mma z", Locale.US))
Run Code Online (Sandbox Code Playgroud)

当我试着这样说时

java.time.format.DateTimeParseException: Text 'Wed Jul 16, 2016 4:38pm EDT' could not be parsed at index 17
Run Code Online (Sandbox Code Playgroud)

那么小时有问题吗?当我放下其中一个'h'时它会进一步增加(尽管它应该只用0-pad我的小时),但是它不喜欢pm-stuff

ZonedDateTime.parse("Wed Jul 16, 2016 4:38pm EDT", DateTimeFormatter.ofPattern("EEE MMM dd, yyyy h:mma z", Locale.US))
java.time.format.DateTimeParseException: Text 'Wed Jul 16, 2016 4:38pm EDT' could not be parsed at index 21
Run Code Online (Sandbox Code Playgroud)

我不知道他的确切问题是什么.当我尝试'hh:mmaa'作为模式时它表示它不喜欢两个a而现在我被卡住了,因为错误消息没有帮助.

java java-8 java-time

12
推荐指数
2
解决办法
6679
查看次数

在JSR-310中查找下一个星期几的事件

鉴于JSR-310对象,例如LocalDate,我如何找到下周三(或任何其他星期几)的日期?

LocalDate today = LocalDate.now();
LocalDate nextWed = ???
Run Code Online (Sandbox Code Playgroud)

java datetime java-8 java-time

11
推荐指数
1
解决办法
1643
查看次数

Java 8 Date and Time API - 解析yyyy-MM-dd'T'HH:mm:ss.SSSZ

我正在尝试以ISO8601格式解析日期:

YYYY-MM-dd'T'HH:MM:ss.SSSZ

我是否正确无法使用java.time.format.DateTimeFormatter中定义的任何默认格式对其进行解析?

例如,ISO_OFFSET_DATE_TIME将仅解析:

YYYY-MM-dd'T'HH:MM:ss.SSSZZ

样品:

yyyy-MM-dd'T'HH:mm:ss.SSSZ
2015-04-29T10:15:00.500+0000

yyyy-MM-dd'T'HH:mm:ss.SSSZZ
2015-04-29T10:15:00.500+00:00
Run Code Online (Sandbox Code Playgroud)

顺便说一句:我知道我可以定义自己的格式化程序,而不是问题.只是想确保我不会失去了一些东西作为ISODateTimeFormat的乔达能够解析两种:

 org.joda.time.format.DateTimeFormatter dateTimeFormatter = ISODateTimeFormat.dateTime();
 DateTime dateTime = dateTimeFormatter.parseDateTime("2015-04-29T10:15:00.500+0000");
Run Code Online (Sandbox Code Playgroud)

java java-8 java-time

11
推荐指数
2
解决办法
1万
查看次数

如何使用DateTimeFormatter解析非标准月份名称

我需要解析(德语)以下列形式的日期:

10. Jan. 18:14
8. Feb. 19:02
1. Mär. 19:40
4. Apr. 18:55
2. Mai 21:55
5. Juni 08:25
5. Juli 20:09
1. Aug. 13:42
[...]
Run Code Online (Sandbox Code Playgroud)

如您所见,如果月份超过4个字符,则会删除月份名称.甚至更奇怪,不要问我为什么,Mär.虽然整个名字都是3月,但是3月份缩短了März.我怎么解析这个java.time?(日期的格式是基于创建日期列表的Android设备的本地化.但是,我没有在Android上解析它)

我的方法是创建一个DateTimeFormatter这样的:

DateTimeFormatter.ofPattern("d. MMMM HH:mm").withLocale(Locale.GERMAN);
// or
DateTimeFormatter.ofPattern("d. MMMMM HH:mm").withLocale(Locale.GERMAN);
Run Code Online (Sandbox Code Playgroud)

但是MMMM这种MMMMM模式和模式都不适合缩短的日期.当然,我可以使用以下模式d. MMM. HH:mm来匹配缩短的月份,但是我无法匹配3个月和4个月的月份.我知道我可以有两个格式化程序(MMM. and MMMMM)但我宁愿有一个解决方案,我只有一个格式化程序,可能还有一个自定义语言环境或类似的东西.

java datetime localization java-8 java-time

11
推荐指数
2
解决办法
2418
查看次数

Java 8 ZoneOffset - 如何获取当前系统UTC偏移量

我想获得我系统的当前ZoneOffset.
我试图这样做,但我找不到办法.
此外,我一直在寻找解决方案,但我没有找到任何解决方案.
是否有可能在Java中这样做?

编辑:
我的问题与此不同.我想知道当前的系统UTC,而不是如何在TimeZone偏移表示或TimeZone存储之间进行转换.

java time utc java-8 java-time

11
推荐指数
2
解决办法
1万
查看次数

从大纪元时间转换瞬间到微秒

在Instant有方法:

  • toEpochMilli它将此瞬间转换为1970-01-01T00:00:00Z时代的毫秒数
  • getEpochSecond它得到的从1970-01-01T00了Java时代的秒数:00:00Z.

这两种方法都失去了精度,例如在toEpochMilliJavaDoc中我看到:

如果此瞬间具有大于毫秒的精度,则转换将丢弃任何多余的精度信息,就好像以纳秒为单位的整数除以一百万.

我没有看到相应的方法来获得更精确的时间戳.如何从Java 8中获取epoch中的微数或纳米数?

java datetime epoch java-8 java-time

11
推荐指数
2
解决办法
4908
查看次数