我有Java 8日期/时间字段的简单文档
@Document
public class Token {
private Instant createdAt;
...
}
Run Code Online (Sandbox Code Playgroud)
我希望坚持使用Spring Data MongoDB 1.5版.但是类型的字段java.time.Instant无法正确反序列化,因为MappingMongoConverter缺少java.time类的转换器.
在Spring 4中,我发现org.springframework.format.datetime.standard.DateTimeConverters了不同的Converters包括InstantToLongConverter并LongToInstantConverter声明为私有静态类.
如何配置MongoTemplate使用它们将Instant字段映射到long?
在Java 8之前,常见的方法是CalendarAPI:
Calendar cal = Calendar.getInstance();
int hour = cal.get(Calendar.HOUR_OF_DAY);
Run Code Online (Sandbox Code Playgroud)
如何获取当前小时,但使用Java 8中提供的新Date-Time API?
我在我的应用程序中使用JSR 310 DateTime API*,我需要解析和格式化军事日期时间(称为DTG或"日期时间组").
我正在解析的格式如下(使用DateTimeFormatter):
"ddHHmm'Z' MMM yy" // (ie. "312359Z DEC 14", for new years eve 2014)
Run Code Online (Sandbox Code Playgroud)
如上所述,这种格式很容易解析.当日期包含与'Z'不同的时区(祖鲁时区,与UTC/GMT相同)时出现问题,例如'A'(Alpha,UTC + 1:00)或'B'(Bravo,UTC + 2:00).有关完整列表,请参阅军事时区.
我该如何解析这些时区?或者换句话说,除了文字"Z"之外,我还可以使用上面的格式来正确解析所有区域?我已经尝试使用"ddHHmmX MMM yy","ddHHmmZ MMM yy"和"ddHHmmVV MMM yy",但他们没有工作(一切都会抛出DateTimeParseException: Text '312359A DEC 14' could not be parsed at index 6了上面的例子中,在解析时).V不允许在格式中使用单个(IllegalArgumentException尝试实例化时DateTimeFormatter).
编辑:z如果不是下面的问题,似乎符号可能有效.
我还要提一下,我已经创建了一个ZoneRulesProvider包含所有命名区域和正确的偏移量.我已经验证使用SPI机制正确注册了这些,并且我的provideZoneIds()方法按预期调用.仍然不会解析.作为一个副问题(编辑:现在这似乎是主要问题),API不允许使用"Z"以外的单字符时区ID(或"区域").
例如:
ZoneId alpha = ZoneId.of("A"); // boom
Run Code Online (Sandbox Code Playgroud)
将抛出DateTimeException: Invalid zone: A(甚至没有访问我的规则提供程序,看它是否存在). …
我有一个数据源与joda时间DateTime对象存储.我需要将它们转换为java ZonedDateTime对象,保留原始时区.
保留偏移量是不够的,因为某些DateTime对象表示每日重复性任务,并且这些任务必须在特定时间段内针对每个日期发生.因此,它们必须遵循指定的TimeZone过渡,例如夏季和冬季时间.我无法告诉DateTime对象的最终用法,因此我需要保留所有对象的时区信息以确保安全.
如何把org.joda.time.DateTime转换成java.time.ZonedDateTime?
将全部
ord.joda.time.DateTimeZone.getId()
映射到可用的ID
java.time.ZoneId
我正在尝试以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) 我需要将一个字符串转换为LocalTime(java-8而不是joda),该字符串可能有也可能没有nanoOfSeconds.String格式的形式为
07:06:05或者07:06:05.123456
字符串在秒内可能有或没有小数位,当它出现时,可以有任意数量的字符来表示Nano Seconds部分.
使用DateTimeForamtter等
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:mm:ss");
Run Code Online (Sandbox Code Playgroud)
要么
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:mm:ss.SSSSSS");
Run Code Online (Sandbox Code Playgroud)
我可以使用IF语句来区分两种格式,例如:
DateTimeFormatter dtf;
if (time1.contains(".") {
dtf = DateTimeFormatter.ofPattern("H:mm:ss.SSSSSS);
} else {
dtf = DateTimeFormatter.ofPattern("H:mm:ss);
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,我很好,但我需要能够在小数点后使用不同数量的位置.
示例数据集可能是:
[11:07:59.68750, 11:08:00.781250, 11:08:00.773437500, 11:08:01]
Run Code Online (Sandbox Code Playgroud)
有没有办法允许格式化程序解析小数点后的任意数字位数而不会java.time.format.DateTimeParseException在小数位数未知时抛出?
我希望我遗漏一些非常简单的东西.
我正在尝试使用java 8 DateTime API解析日期时间字符串.
要解析的字符串包含日期,月份,年份和AM/PM标记,例如17/02/2015 PM.我使用以下模式:dd/MM/yyyy aa我希望解析的LocalDateTime时间部分设置为12:00:00或00:00:00取决于AM/PM标记.
使用以前的java.text.SimpleDateFormatAPI,解析使用此模式按预期工作.
但是当我使用java 8 DateTime API并运行以下代码时:
LocalDateTime.parse("17/02/2015 PM", DateTimeFormatter.ofPattern("dd/MM/yyyy aa"));
Run Code Online (Sandbox Code Playgroud)
我得到以下异常:
Exception in thread "main" java.lang.IllegalArgumentException: Too many pattern letters: a
at java.time.format.DateTimeFormatterBuilder.parseField(DateTimeFormatterBuilder.java:1765)
at java.time.format.DateTimeFormatterBuilder.parsePattern(DateTimeFormatterBuilder.java:1604)
at java.time.format.DateTimeFormatterBuilder.appendPattern(DateTimeFormatterBuilder.java:1572)
at java.time.format.DateTimeFormatter.ofPattern(DateTimeFormatter.java:534)
Run Code Online (Sandbox Code Playgroud)
如果我将模式切换到dd/MM/yyyy a那时我得到了以下异常:
Exception in thread "main" java.time.format.DateTimeParseException: Text '17/02/2015 PM' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {AmPmOfDay=1},ISO resolved to 2015-02-17 of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1918)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1853)
at java.time.LocalDateTime.parse(LocalDateTime.java:492) …Run Code Online (Sandbox Code Playgroud) 据我所知,a ZonedDateTime实际上是一个增强版本Instant.它具有所有数据Instant(沿UTC时间线的精确值),以及时区信息.因此,我天真的假设是,a ZonedDateTime -an Instant并且任何采取Instant遗嘱的方法都会采取ZonedDateTime相反的方式.此外,我所料isBefore(),isAfter()等之间进行无缝协作InstantS和ZonedDateTime秒.
查看API文档,Instant并且ZonedDateTime没有一个是这种情况.我可以将Instants与Instants和ZonedDateTimes 进行比较ZonedDateTime,但这两个类似乎是不兼容的.更重要的是,像ThreeTen-Extra这样的第三方代码Interval似乎只适用于Instants.
是否存在Instant并且ZonedDateTime不打算混合的原因?
我正在尝试使用Duration该类而不是long.它具有优越的文字语法.我喜欢它的灵活性,虽然它看起来很奇怪.
"PT10S"意味着10秒,接受"10秒"的问题是什么?!好的没关系.
我只是好奇为什么选择了PT前缀(不是"DU"例如)以及为什么任何前缀在这里更好而不是什么?
在我的Mac和Windows机器上创建新的LocalDateTime使用时LocalDateTime.now(),我的Mac上的nano 精度为6,而我的Windows机器上的纳米精度为3.两者都在运行jdk-1.8.0-172.