标签: localdatetime

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

带有时区和毫秒的 LocalDateTime 格式

我正在尝试编写一个DateTimeFormatter来解析以下格式:

2020-05-29T07:51:33.106-07:00
Run Code Online (Sandbox Code Playgroud)

我看过ISO_OFFSET_DATE_TIME,但问题是它不包含毫秒。所以我决定自己写。

没有时区很容易做到这一点:

public static void main (String[] args) throws java.lang.Exception {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
    System.out.println(
        LocalDateTime.parse("2020-05-29T07:51:33.106", formatter)
    );
}
Run Code Online (Sandbox Code Playgroud)

它工作得很好

但是当我尝试以格式添加时区时

public static void main (String[] args) throws java.lang.Exception {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
    System.out.println(
        LocalDateTime.parse("2020-05-29T07:51:33.106-07:00", formatter)
    );
}
Run Code Online (Sandbox Code Playgroud)

它现在失败,但无法解析时区。

Exception in thread "main" java.time.format.DateTimeParseException: Text '2020-05-29T07:51:33.106-07:00' could not be parsed at index 23
    at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2049)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1951)
    at java.base/java.time.LocalDateTime.parse(LocalDateTime.java:492)
    at Ideone.main(Main.java:16)
Run Code Online (Sandbox Code Playgroud)

如何以这种格式解析时区?

java timezone localdatetime

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

在 Java 中将字符串转换为 LocalDateTime

我有这个字符串

2020 年 8 月 7 日星期五 18:00:00 +0000

我需要将其转换为 LocalDateTime

我尝试了几种方法:

创建一个 DateTimeFormatter 并解析字符串

String dateString = "Fri, 07 Aug 2020 18:00:00 +0000";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E, dd MMM yyyy HH:mm:ss", Locale.getDefault());
LocalDateTime parsedDate = LocalDateTime.parse(publishedString, formatter);
Run Code Online (Sandbox Code Playgroud)

使用 SimpleDateFormat 将其转换为日期,然后将 resultDate 转换为 LocalDateTime

String dateString = "Fri, 07 Aug 2020 18:00:00 +0000";
SimpleDateFormat dateFormatter = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss Z");
Date date = dateFormatter.parse(publishedString);
LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
Run Code Online (Sandbox Code Playgroud)

两种解决方案都给了我同样的例外:

java.time.format.DateTimeParseException: Text 'Fri, 07 Aug 2020 18:00:00 +0000' …
Run Code Online (Sandbox Code Playgroud)

java date localdatetime

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

如何在 Java 8 上使用 LocalDateTime.now() 获取当前的 LocalDateTime 包括秒数

我使用 LocalDateTime.now()在Java 8 中获得 LocalDateTime 。但有时这个 now() 函数以没有秒的格式返回时间给我。我认为这是因为秒为零,但我需要秒。

代码:

List <LocalDateTime> times = Arrays.asList(
                                 LocalDateTime.now(),
                                 LocalDateTime.parse("2020-09-13T20:53", DateTimeFormatter.ISO_LOCAL_DATE_TIME),
                                 LocalDateTime.parse(LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME))
                             );

for (LocalDateTime time: times)
    System.out.println("Time: " + time);
Run Code Online (Sandbox Code Playgroud)

安慰:

Time: 2020-09-13T18:42:25.775
Time: 2020-09-13T20:53
Time: 2020-09-13T18:42:25.779
Run Code Online (Sandbox Code Playgroud)

Time: 2020-09-13T20:53 已经没有秒了。

PD:我有一个调度程序,它每 30 秒运行一次“LocalDatetime.now ()”。这是它在控制台中显示的内容。

2020-09-10T09:14:00.001
2020-09-10T09:14:30.001
2020-09-10T09:15:00.001
2020-09-10T09:15:30.001
2020-09-10T09:16:00.001
2020-09-10T09:16:30
2020-09-10T09:17
2020-09-10T09:17:30.001
2020-09-10T09:18:00.001
2020-09-10T09:18:30
2020-09-10T09:19:00.001
2020-09-10T09:19:30.001
2020-09-10T09:20:00.001
2020-09-10T09:20:30
2020-09-10T09:21:00.001
2020-09-10T09:21:30
2020-09-10T09:22:00.001
2020-09-10T09:22:30.001
2020-09-10T09:23
2020-09-10T09:23:30.001
2020-09-10T09:24
2020-09-10T09:24:30
2020-09-10T09:25
2020-09-10T09:25:30
2020-09-10T09:26:00.001
2020-09-10T09:26:30
Run Code Online (Sandbox Code Playgroud)

java spring localdate localdatetime datetimeformatter

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

将小写的短工作日解析为 Java 8 的时间 DayOfWeek

我有一个字符串,例如“mon”或“tue”或“sun”。我想将其解析为 a DayOfWeek(如果不成功则为 null)。

我正在使用 Kotlin,但我想 Java 人员也会明白我想做什么:

private fun String.parseToDayOfWeek(pattern: String = "EE") =
    try {
        DateTimeFormatter.ofPattern(pattern, Locale.US).parse(this, DayOfWeek::from)
    } catch (e: Exception){
        null
    }
Run Code Online (Sandbox Code Playgroud)

这不起作用,我只是得到nulls。

相反,在我解析它之前,我必须像这样清理字符串:

val capitalized = this.lowercase().replaceFirstChar { it.uppercase() }
Run Code Online (Sandbox Code Playgroud)

这感觉很麻烦。我使用的 api 是错误的还是这是一个巨大的绊脚石?

java dayofweek date-parsing java-time localdatetime

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

如何将“2021-11-20+01:00”格式的日期字符串解析为 ZonedDateTime - 错误

如何将“2021-11-20+01:00”格式的日期解析为ZonedDateTime?我正在尝试:

String value = "2021-11-20+01:00";
ZonedDateTime zDate = ZonedDateTime.parse(value, DateTimeFormatter.ofPattern("yyyy-MM-ddxxx"));
Run Code Online (Sandbox Code Playgroud)

但出现这个奇怪的错误:

java.time.format.DateTimeParseException:无法解析文本“2021-11-20+01:00”:无法从 TemporalAccessor 获取 ZonedDateTime:{OffsetSeconds=3600},ISO 解析为 java 类型的 2021-11-20。时间.格式.解析

...不支持的字段:InstantSeconds...

有什么建议么?欧洲 VIES VAT ID 检查系统在接收 XML (SOAP) 响应时使用此时间格式: <requestDate>2021-11-20+01:00</requestDate>。同样的错误与OffsetDateTime..

有趣的是,Javadoc 说“三个字母 (x) 输出小时和分钟,带有冒号,例如 '+01:30'”。那么为什么上面的模式不起作用呢?

也尝试过这个 - 同样的错误:

ZonedDateTime zDate = ZonedDateTime.parse(value, DateTimeFormatter.ISO_OFFSET_DATE);
Run Code Online (Sandbox Code Playgroud)

完整的错误日志:

Exception in thread "main" java.time.format.DateTimeParseException: Text '2021-11-20 +01:00' could not be parsed: Unable to obtain OffsetDateTime from TemporalAccessor: {OffsetSeconds=3600},ISO resolved to 2021-11-20 of type java.time.format.Parsed
    at java.base/java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:2017)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1952)
    at …
Run Code Online (Sandbox Code Playgroud)

java parsing localdatetime datetimeformatter

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

在当前时间基础上添加 30 分钟

我已经编写了下面的代码,但如果当前日期时间是2022-07-03 09:48:05.448并且我添加30 分钟,我的响应将返回2022-07-03 09:79:05.448

但分钟永远不可能是 79,它应该改为小时......

public static String getExpiryDate(int additionalMinutesToCurrentMinute) {
    LocalDateTime now = LocalDateTime.now();
    int year = now.getYear();
    int month = now.getMonthValue();
    int day = now.getDayOfMonth();
    int hour = now.getHour();
    int minute = now.getMinute() + additionalMinutesToCurrentMinute;
    int second = now.getSecond();
    int millis = now.get(ChronoField.MILLI_OF_SECOND); // Note: no direct getter available.

    String expiryDateAndTime = String.format("%d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, minute, second, millis);
    return expiryDateAndTime;
}
Run Code Online (Sandbox Code Playgroud)

java java-time localdatetime

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

f:convertDateTime 与 LocalDateTime 抛出“无法将给定对象格式化为日期”

我有一个本地日期时间属性:

private LocalDatetime date;
Run Code Online (Sandbox Code Playgroud)

我想以这种格式显示它dd-MM-yyyy HH:mm:ss

<h:outputText value="#{transaction.date}">
    <f:convertDateTime pattern="dd-MM-yyyy HH:mm:ss"/>
</h:outputText>
Run Code Online (Sandbox Code Playgroud)

但我得到了这个例外:

java.lang.IllegalArgumentException:无法将给定对象格式化为日期

这是如何引起的以及如何解决?

jsf localdatetime

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

如何将“2016 年 11 月 20 日 12:00:00 AM”解析为 LocalDateTime?

我发现了非常有趣的错误或类似的东西。

我使用这种日期格式MMM d, yyyy hh:mm:ss a,它会像这样打印日期

Aug 13, 2020 01:19:50 pm
Run Code Online (Sandbox Code Playgroud)

但是,当我分析Nov 20, 2016 12:00:00 AMLocalDateTime,它抛出异常

java.time.format.DateTimeParseException: Text 'Nov 20, 2016 12:00:00 AM' could not be parsed at index 22.
Run Code Online (Sandbox Code Playgroud)

在我将 'AM' 更改为 'am' 后,它完美运行!所以LocalDateTime字面上无法解析日期,因为大写 a?p?e?s?字母?我该如何解决这个问题,而不用将 'AM' 替换为 'am' 并将 'PM' 替换为 'pm'

编辑

SimpleDateTime格式没有这个问题,他忽略了 a?p?e?s? 字母寄存器(我的意思是大写或小写)我不想转换DateLocalDateTime

编辑 2

MMM d, yyyy hh:mm:ss A 将 'a' 替换为 'A' 也不起作用

java datetime-format localdatetime datetimeformatter

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

使用 java.time 将 UTC 日期时间转换为本地日期时间

我有一个像这样的 UTC 日期时间(字符串):2022-11-22T17:15:00

还有一个像这样的 ZoneID:"America/Tijuana"

使用 java.time API,我想获取该区域的实际日期时间,即:(2022-11-22T09:15:00时间是 09:15 而不是 17:15)

  • ZonedDateTime.toLocalDateTime() 返回:2022-11-22T17:15
  • ZonedDateTime.toString() 返回: 2022-11-22T17:15-08:00[America/Tijuana]

以上都没有给我我正在寻找的东西。

这是我的代码:

    ZoneId zonaID = ZoneId.of('America/Tijuana');
    CharSequence dateUTC = "2022-11-22T17:15:00";
    LocalDateTime dateTimeL = LocalDateTime.parse(dateUTC);
    ZonedDateTime myZDT = ZonedDateTime.now();
    ZonedDateTime myZDTFinal = myZDT.of(dateTimeL, zonaID);
    System.out.println("using toLocalDateTime: " + myZDTFinal.toLocalDateTime());
    System.out.println("using toString: " + myZDTFinal.toString());
Run Code Online (Sandbox Code Playgroud)

我知道这可能是一个重复的问题,但有很多关于日期时间的问题,我只是无法弄清楚这一点。

任何帮助将不胜感激。

java java-time localdatetime

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