标签: localdatetime

Java 8 和 Java 11 中 LocalDateTime 到毫秒的差异

我目前正在将一些项目从 Java 8 升级到 Java 11,其中一个转换器的单元测试失败了。基本上问题源于由于先前通过 JDK 8 传递的日期精度导致的相等性检查失败。

这是测试的部分示例,为了清楚起见,我移动了转换器的内容:

@Test
public void testDateTime() {
    LocalDateTime expected = LocalDateTime.now().plusDays(1L);

    // converter contents
    long epochMillis = expected.atZone(ZoneId.systemDefault())
            .toInstant().toEpochMilli();
    LocalDateTime actual = LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMillis),
            TimeZone.getDefault().toZoneId());


    assertThat(actual, equalTo(expected));
}
Run Code Online (Sandbox Code Playgroud)

由于以下原因,这会导致资产错误:

Expected :<2021-06-02T14:06:21.820299>
Actual   :<2021-06-02T14:06:21.820>
Run Code Online (Sandbox Code Playgroud)

我可以用 assertThat(actual, equalTo(expected.truncatedTo(ChronoUnit.MILLIS)))它们相等,但是,这意味着每次与被测试的转换器类进行比较(isAfter、isBefore、equals)时,都必须应用中继。

对于 JDK 11(或者我可能错过的文档:)),是否有正确的方法可以在LocalDateTimeto之间进行转换,Long反之亦然?


更新:

正如评论中所指出的,Java 8 和 11 的表示形式不同,因此导致测试失败。为了提供有关本文所要求内容的更多上下文,这里是测试验证的 2 种方法(我将其移至测试本身以仅捕获正在执行的内容,因为失败的单元测试属于使用实用方法)

public Long localDateTimeToEpochMillis(LocalDateTime ldt) {
    Instant instant = ldt.atZone(ZoneId.systemDefault()).toInstant();
        return ldt.atZone(ZoneId.systemDefault())
           .toInstant().toEpochMilli();
}
Run Code Online (Sandbox Code Playgroud)

public LocalDateTime epochMillisToLocalDateTime(long epochMillis) {
    return LocalDateTime.ofInstant( …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-11 localdatetime

9
推荐指数
1
解决办法
273
查看次数

如何格式化 kotlinx-datetime LocalDateTime?

我正在将一些代码从使用 Java 8 转换LocalDatetime为使用该版本kotlinx-datetime,但我找不到任何格式化方法。具体来说,我正在替换FormatStyle.MEDIUM. 它们不存在并且我需要编写格式吗?

这是针对 Android 应用程序的。有没有我可以使用的 Android 特定库?或者我可以使用 Java 8 之前的方法来保持对旧版本 Android 的支持吗?

编辑(我的解决方案基于 Arvind 的答案)

fun Instant.toDateTimeString(formatStyle: FormatStyle = FormatStyle.MEDIUM): String {
    val localDatetime = toLocalDateTime(TimeZone.currentSystemDefault())
    val formatter = DateTimeFormatter.ofLocalizedDateTime(formatStyle)
    return formatter.format(localDatetime.toJavaLocalDateTime())
}
Run Code Online (Sandbox Code Playgroud)

android kotlin localdatetime kotlinx-datetime

8
推荐指数
1
解决办法
8167
查看次数

如果提前 1、2、3、4 分钟,如何将其向下舍入到最接近的 5 分钟间隔?

我想将 Instant / LocalDateTime 舍入到 Java 中最接近的 5 分钟间隔。

示例:假设时间是:

2021-02-08T19:01:49.594 
Run Code Online (Sandbox Code Playgroud)

或者

2021-02-08T19:02:49.594
Run Code Online (Sandbox Code Playgroud)

或者

2021-02-08T19:03:49.594
Run Code Online (Sandbox Code Playgroud)

或者

2021-02-08T19:04:49.594
Run Code Online (Sandbox Code Playgroud)

预期结果:

2021-02-08T19:00:00.000
Run Code Online (Sandbox Code Playgroud)

java instant java-8 localdatetime

6
推荐指数
2
解决办法
4197
查看次数

将 swagger 格式:日期时间转换为 LocalDateTime.class

我有一个无法更改的 swagger.json 规范。我正在使用swagger-codegen从 swagger.json 创建一个库,如下所示:

$ java -jar swagger-codegen-cli.jar generate -i swagger.json -l java -o .
Run Code Online (Sandbox Code Playgroud)

问题是在我的 swagger.json 中,一些格式被声明为date-time并且 codegen 将它们转换为OffsetDateTime类类型...但是我的服务请求的响应以 LocalDateTime 的形式出现,如下所示

{....,
"expirationDeadline": "2022-04-22T10:36:13.383",
....}
Run Code Online (Sandbox Code Playgroud)

因此,当我使用该库并尝试反序列化包含2022-04-22T10:36:13.383我的类的 JSONObject 时,它会失败,因为它无法转换2022-04-22T10:36:13.383OffsetDateTime.

最终,经过一番搜索后,我遵循了类似这样的其他一些线程,并设法将OffsetDateTime类型更改为LocalDateTime使用导入和类型映射,如下所示:

$ java -jar swagger-codegen-cli.jar generate \
-i updated-swagger.json \
-l java \
-o ./java-client-swagger-codegen/ \
--import-mappings org.threeten.bp.OffsetDateTime=org.threeten.bp.LocalDate \
--type-mappings OffsetDateTime=LocalDate
Run Code Online (Sandbox Code Playgroud)

但现在的问题是,swagger-codegen只使用OffsetDateTimeTypeAdaper、和创建 JSON 类DateTypeAdapter,如下所示:LocalDateTypeAdapterSqlDateTypeAdapter

在此输入图像描述

因此,现在每当我尝试反序列化包含 …

json date-formatting swagger swagger-codegen localdatetime

5
推荐指数
1
解决办法
2789
查看次数

根据 LocalDateTime 对象列表和使用流获取的时隙列表创建可用时隙列表

我有一个包含具有以下字段的List<Timeslot>实体:Timeslot

  1. timeslot_id;
  2. day;
  3. start_time;
  4. end_time

例如,此列表包含两条记录:

  • start_time第一个记录的等于9:00end_time等于10:00

  • start_time第二个对象的 equals10:00end_timeequals 11:00

第二个列表包含时间戳List<LocalDateTime>

[2022-04-16T08:00, 2022-04-16T09:00, 2022-04-16T10:00, 2022-04-16T11:00, 
 2022-04-16T12:00, 2022-04-16T13:00, 2022-04-16T14:00, 2022-04-16T15:00]
Run Code Online (Sandbox Code Playgroud)

我需要创建第三个List<Timeslot>,其中包含Timeslot第一个列表中除这两个之外的 s 。

在这种情况下,结果第三个列表应该包含六个Timeslot类对象。

start_timefirst 应该等于2022-04-16T08:00end_time 2022-04-16T09:00。即每隔一个时间段start_time和之间的差异是一小时end_time

因此,从上面提供的时间戳列表构造的结果应包含六个对象:

  • start_time伊斯兰8:00国。end_time …

java list java-stream localdatetime

5
推荐指数
1
解决办法
248
查看次数

如何使用 LocalDateTime.parse(...) 解析 ISO 日期

我想解析这样的日期字符串2011-11-30

LocalDateTime.parse("2011-11-30", DateTimeFormatter.ISO_LOCAL_DATE)
Run Code Online (Sandbox Code Playgroud)

但我得到以下异常:

java.time.format.DateTimeParseException: Text '2011-11-30' could not be parsed:
Unable to obtain LocalDateTime from TemporalAccessor
Run Code Online (Sandbox Code Playgroud)

如果我传递一个日期时间字符串,一切都按预期工作:

LocalDateTime.parse("2011-11-30T23:59:59", DateTimeFormatter.ISO_LOCAL_DATE_TIME)
Run Code Online (Sandbox Code Playgroud)

如何将日期解析为2011-11-30LocalDateTime(具有默认时间)?

java datetime iso java-time localdatetime

4
推荐指数
1
解决办法
9514
查看次数

DateTimeFormatter 的日期格式问题

我有以下格式的日期:1/1/2020 3:4:7 AM我正在尝试使用DateTimeFormatter.

我有以下带有格式化程序的代码来解析它,但它不起作用。

LocalDateTime date = LocalDateTime.parse("1/1/2020 3:4:7 AM", DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a"));
Run Code Online (Sandbox Code Playgroud)

我收到以下异常:

java.time.format.DateTimeParseException: Text '1/1/2020 3:4:7 AM' could not be parsed at index 0

谁能帮我?

java java-time localdatetime datetimeformatter java.time.localdatetime

4
推荐指数
1
解决办法
477
查看次数

Java LocalDateTime 文本无法在索引 0 处解析异常

尝试将字符串格式的日期转换为 Java LocalDateTime。

private DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm");
private String caseStartDate = dateFormat.format(LocalDateTime.now());

LocalDateTime localdatetime = LocalDateTime.parse(caseStartDate);
Run Code Online (Sandbox Code Playgroud)

但最终出现了这个异常:

java.time.format.DateTimeParseException:无法在索引 0 处解析文本“01/03/2020 15:13”

这个格式不支持转换吗?

java localdatetime

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

获取月份的最后一个日期

我有一个 LocalDateTime 对象,我想获取该月的最后一个日期。因此,如果 localDateTime 指向今天的日期 10 月 29 日。我想将其转换为 10 月 31 日
有没有一种干净、简单的方法可以做到这一点?
我的想法:
一种方法是获取月份,然后做出 switch 声明。但这将是漫长而乏味的方法。不确定是否有内置方法
可以执行相同的操作

java localdatetime

3
推荐指数
2
解决办法
769
查看次数

从 Date 到 LocalDatetime 的 Mapstruct 转换

我正在尝试使用具有 Date (java.util.Date) 字段的 Mapstruct 的映射器将对象转换为具有 LocalDateTime 字段的对象。问题在于它映射的时间错误,因为在具有 LocalDateTime 字段的对象中它总是显示少 2 小时。

@Mapping(source = "createdDate", target = "createdLocalDateTime")
ObjectA toEntity(ObjectB);
Run Code Online (Sandbox Code Playgroud)

我认为问题在于自动实现:

if ( createdDate!= null ) {
        objectA.createdLocalDateTime( LocalDateTime.ofInstant( createdDate.toInstant(), ZoneId.of( "UTC" ) ) );
    }
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?谢谢!

java date spring-boot mapstruct localdatetime

3
推荐指数
1
解决办法
6689
查看次数