我目前正在将一些项目从 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 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) 我想将 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) 我有一个无法更改的 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.383为OffsetDateTime.
最终,经过一番搜索后,我遵循了类似这样的其他一些线程,并设法将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
因此,现在每当我尝试反序列化包含 …
我有一个包含具有以下字段的List<Timeslot>实体:Timeslot
timeslot_id;day;start_time;end_time。例如,此列表包含两条记录:
start_time第一个记录的等于9:00和end_time等于10:00。
start_time第二个对象的 equals10:00和end_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 …我想解析这样的日期字符串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(具有默认时间)?
我有以下格式的日期: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
尝试将字符串格式的日期转换为 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”
这个格式不支持转换吗?
我有一个 LocalDateTime 对象,我想获取该月的最后一个日期。因此,如果 localDateTime 指向今天的日期 10 月 29 日。我想将其转换为 10 月 31 日
有没有一种干净、简单的方法可以做到这一点?
我的想法:
一种方法是获取月份,然后做出 switch 声明。但这将是漫长而乏味的方法。不确定是否有内置方法
可以执行相同的操作
我正在尝试使用具有 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)
我怎样才能解决这个问题?谢谢!