我的程序正在将输入字符串解析为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但找不到任何内容.
如果一个月是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 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模式的最佳实践解决方案是什么?
提前致谢.
如何更改现有ZonedDateTime对象的时间部分?我想保留日期和时区,但改变小时和分钟.
我试图解析一些日期,但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而现在我被卡住了,因为错误消息没有帮助.
鉴于JSR-310对象,例如LocalDate,我如何找到下周三(或任何其他星期几)的日期?
LocalDate today = LocalDate.now();
LocalDate nextWed = ???
Run Code Online (Sandbox Code Playgroud) 我正在尝试以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) 我需要解析(德语)以下列形式的日期:
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)但我宁愿有一个解决方案,我只有一个格式化程序,可能还有一个自定义语言环境或类似的东西.
我想获得我系统的当前ZoneOffset.
我试图这样做,但我找不到办法.
此外,我一直在寻找解决方案,但我没有找到任何解决方案.
是否有可能在Java中这样做?
编辑:
我的问题与此不同.我想知道当前的系统UTC,而不是如何在TimeZone偏移表示或TimeZone存储之间进行转换.
在Instant有方法:
toEpochMilli它将此瞬间转换为1970-01-01T00:00:00Z时代的毫秒数getEpochSecond它得到的从1970-01-01T00了Java时代的秒数:00:00Z.这两种方法都失去了精度,例如在toEpochMilliJavaDoc中我看到:
如果此瞬间具有大于毫秒的精度,则转换将丢弃任何多余的精度信息,就好像以纳秒为单位的整数除以一百万.
我没有看到相应的方法来获得更精确的时间戳.如何从Java 8中获取epoch中的微数或纳米数?