我正在尝试使用具有 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)
我怎样才能解决这个问题?谢谢!
我正在尝试编写一个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)
如何以这种格式解析时区?
我有这个字符串
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) 我使用 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) 我有一个字符串,例如“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 是错误的还是这是一个巨大的绊脚石?
如何将“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) 我已经编写了下面的代码,但如果当前日期时间是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) 我有一个本地日期时间属性:
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:无法将给定对象格式化为日期
这是如何引起的以及如何解决?
我发现了非常有趣的错误或类似的东西。
我使用这种日期格式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 AM到LocalDateTime,它抛出异常
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? 字母寄存器(我的意思是大写或小写)我不想转换Date为LocalDateTime
编辑 2
MMM d, yyyy hh:mm:ss A 将 'a' 替换为 'A' 也不起作用
我有一个像这样的 UTC 日期时间(字符串):2022-11-22T17:15:00
还有一个像这样的 ZoneID:"America/Tijuana"
使用 java.time API,我想获取该区域的实际日期时间,即:(2022-11-22T09:15:00时间是 09:15 而不是 17:15)
2022-11-22T17:152022-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)
我知道这可能是一个重复的问题,但有很多关于日期时间的问题,我只是无法弄清楚这一点。
任何帮助将不胜感激。
localdatetime ×10
java ×9
java-time ×3
date ×2
date-parsing ×1
dayofweek ×1
jsf ×1
localdate ×1
mapstruct ×1
parsing ×1
spring ×1
spring-boot ×1
timezone ×1