标签: java-time

Java 8日期/时间(JSR-310)类型与Spring Data MongoDB的映射

我有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 java-8 spring-data spring-data-mongodb java-time

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

如何使用Java 8中的新Date-Time API获取当前小时?

在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?

java java-8 java-time

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

军事时区使用JSR 310(DateTime 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(甚至没有访问我的规则提供程序,看它是否存在). …

java timezone datetime java-time

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

如何转换org.joda.time.DateTime到java.time.ZonedDateTime

我有一个数据源与joda时间DateTime对象存储.我需要将它们转换为java ZonedDateTime对象,保留原始时区.

保留偏移量是不够的,因为某些DateTime对象表示每日重复性任务,并且这些任务必须在特定时间段内针对每个日期发生.因此,它们必须遵循指定的TimeZone过渡,例如夏季和冬季时间.我无法告诉DateTime对象的最终用法,因此我需要保留所有对象的时区信息以确保安全.

如何把org.joda.time.DateTime转换成java.time.ZonedDateTime?

将全部

ord.joda.time.DateTimeZone.getId()

映射到可用的ID

java.time.ZoneId

java timezone datetime jodatime java-time

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

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万
查看次数

使用/不使用nanoOfSeconds将字符串转换为LocalTime

我需要将一个字符串转换为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 formatter localtime java-8 java-time

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

使用java 8 DateTime API解析日期和AM/PM

我正在尝试使用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)

java java-8 java-time

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

Instant和ZonedDateTime之间的兼容性

据我所知,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不打算混合的原因?

java datetime java-time

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

"PT"前缀在持续时间中代表什么?

我正在尝试使用Duration该类而不是long.它具有优越的文字语法.我喜欢它的灵活性,虽然它看起来很奇怪.

"PT10S"意味着10秒,接受"10秒"的问题是什么?!好的没关系.

我只是好奇为什么选择了PT前缀(不是"DU"例如)以及为什么任何前缀在这里更好而不是什么?

java duration iso8601 period java-time

11
推荐指数
3
解决办法
6609
查看次数

LocalDateTime.now()在Windows和Mac计算机上具有不同的精度级别

在我的Mac和Windows机器上创建新的LocalDateTime使用时LocalDateTime.now(),我的Mac上的nano 精度为6,而我的Windows机器上的纳米精度为3.两者都在运行jdk-1.8.0-172.

  • 是否可以限制或提高其中一台机器的精度?
  • 为什么精度实际上不同?

java precision platform java-time

11
推荐指数
3
解决办法
694
查看次数