我有一个关于 java 的问题DataTimeFormmater。我觉得我错过了一些东西,但又不知道到底错过了什么。
String format = "yyyy-MM-dd'T'HH:mm:ss[.S]'T'zxxx";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
String date = "2017-07-05T12:28:36.4TGMT+03:00";
System.out.println(formatter.format(ZonedDateTime.now()));
System.out.println(formatter.parse(date));
Run Code Online (Sandbox Code Playgroud)
上面的代码生成当前的字符串ZonedDateTime,并尝试使用相同的日期格式化程序解析日期时间字符串。2017-07-05T06:07:51.0TCDT-05:00成功生成但无法解析的结果2017-07-05T12:28:36.4TGMT+03:00
我的目标是解析2017-07-05T12:28:36.4TGMT+03:00并提出适当的DateTimeFormatter.
ZonedDateTime我正在使用 JDK 8,并且Timestamp经常使用它。但我仍然无法解决我面临的问题。
假设我得到了TimestampGMT (UTC) 格式的文件,并且我的服务器位于某处。假设它设置为Asia/CalcuttaTimeZone (其 ZoneOffset 为+05:30)。
基本上如何在时间戳中添加/减去我的时区偏移量?
Input : 2017-09-13 13:10:30.333
Output: 2017-09-13 18:40:30.333
Run Code Online (Sandbox Code Playgroud)
解释 :在输入中,时区偏移量 5hrs 30mts 已添加到输入中。此外,输入是 Timestamp 类型,输出也是 Timestamp 类型。
我使用ZoneID.systemDefault()函数来检索 JVM 已知的时区。就我而言,时区结果是Asia/Calcutta.
我正在尝试用 java.time 替换 org.joda.time.Period 。
我们将以下值存储在数据库中。
P1M, P1Y, P1D, PT1H, PT1M
Run Code Online (Sandbox Code Playgroud)
只是为了解析这个值:
Period monthly = ISOPeriodFormat.standard().parsePeriod(<One of the above value from DB>);
Run Code Online (Sandbox Code Playgroud)
这很简单并且得到预期的周期。但是,现在换成java.time就麻烦了。
因为,P1D, P1M, P1Y应该使用以下代码进行解析:
java.time.Period period = java.time.Period.parse("P1M");
Run Code Online (Sandbox Code Playgroud)
并且,P1H and P1D应该使用下面的代码进行解析。
Duration dailyD = Duration.parse("P1D");
Run Code Online (Sandbox Code Playgroud)
所以,我可能还需要一些字符串检查,例如:
if(value.startsWith("PT")) {
// Use java.time.Duration
} else {
// Use java.time.Period
}
Run Code Online (Sandbox Code Playgroud)
这个逻辑有更好的代码吗?
另外,最后,我必须根据上面的 java.time.Period 或 java.time.Duration 查找从某个 startTime 到 截至日期 的出现次数。
就像,如果 startDateTime 是01/01/2015 08:30:
LocalDateTime startDateTime = // the above startDateTime ..
if(value.startsWith("PT")) { …Run Code Online (Sandbox Code Playgroud) 在我的另一个关于如何将仅日期字符串解析为 LocalDateTime 的问题之后,在尝试使用模式 yyyyMMdd[HHmmss] 解析字符串 20120301122133 时,我收到错误。奇怪的是,使用模式 yyyyMMdd[ HHmmss] 解析 20120301 122133 效果很好。
所以这段代码工作正常
LocalDateTime.parse(
"19940513 230000",
new DateTimeFormatterBuilder()
.appendPattern("yyyyMMdd[ HHmmss]")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.toFormatter()
)
Run Code Online (Sandbox Code Playgroud)
而这个失败了
LocalDateTime.parse(
"19940513230000",
new DateTimeFormatterBuilder()
.appendPattern("yyyyMMdd[HHmmss]")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.toFormatter()
)
Run Code Online (Sandbox Code Playgroud)
我应该如何使用java 8时间API解析格式为yyyyMMdd[HHmmss]的字符串,即格式为yyyyMMddHHmmss且带有可选时间部分的字符串?
解析模式是一个可配置选项,因此仅在运行时才知道。因此,我无法用硬编码的 DateTimeFormatterBuilder 调用替换 String 模式。
我正在从在 Spring MVC 应用程序中使用新类java.sql.Timestamp转向java.util.GregorianCalendar使用新类。java.time.*
所以我改变了每一个
private GregorianCalendar field;
Run Code Online (Sandbox Code Playgroud)
到
private LocalDate field;
Run Code Online (Sandbox Code Playgroud)
或者
private LocalDateTime field;
Run Code Online (Sandbox Code Playgroud)
但现在当序列化这些 bean 时,它们会像这样序列化:
"field": {
"year": 1970,
"month": "JANUARY",
"dayOfMonth": 18,
"dayOfWeek": "SUNDAY",
"era": "CE",
"dayOfYear": 18,
"leapYear": false,
"monthValue": 1,
"chronology": {
"id": "ISO",
"calendarType": "iso8601"
}
},
Run Code Online (Sandbox Code Playgroud)
我找到了其他问题的答案,提到添加对jackson-datatype-jsr310 的依赖项并获得:
"field": [
1970,
1,
18
],
Run Code Online (Sandbox Code Playgroud)
但我在序列化时仍然想要一个 unix 时间戳,就像我在字段中得到的那样GregorianCalendar:我怎样才能实现这一点?我可以避免使用自定义序列化器(和反序列化器)吗?
这些与资源响应和请求主体(如 POST、PUT 等)相关,而不是请求参数。
Jackson 的ObjectMapper配置如下:
jacksonConverter.getObjectMapper().enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
jacksonConverter.getObjectMapper().disable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS);
Run Code Online (Sandbox Code Playgroud) 我正在使用 DateTimeFormatter 来格式化日期:
\n\n ZonedDateTime date = ZonedDateTime.parse("2015-12-03T18:15:30+01:00[America/New_York]");\n\n DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL)\n .withLocale(Locale.FRENCH);\n\n System.out.println(formatter.format(date));\nRun Code Online (Sandbox Code Playgroud)\n\n代码输出:
\n\njeudi 3 d\xc3\xa9cembre 2015 18 h 15 EST\nRun Code Online (Sandbox Code Playgroud)\n\n如何将时区从 EST 翻译为法语 HNE (Heure Normale de l\'Est)?
\n\n任何帮助将不胜感激。
\n我正在尝试从格式为 (yyyy-MM-dd HH:mm z) 的字符串中解析 ZonedDateTime 。输入字符串 (2019-08-29 00:00 IST) 生成 UTC 时间戳。
调试使我发现 IST 的 ZoneId 被映射到大西洋/雷克雅未克,这是没有意义的。它应该被映射为亚洲。
timestamp = ZonedDateTime.parse(timeInput, DATE_WITH_TIMEZONE_FORMATTER)
.toInstant().toEpochMilli()
Run Code Online (Sandbox Code Playgroud)
在哪里
DateTimeFormatter DATE_WITH_TIMEZONE_FORMATTER = DateTimeFormatter
.ofPattern(DATE_TIME_WITH_TIMEZONE_PATTERN).withChronology(IsoChronology.INSTANCE);
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么吗?
我有一个即时日期,例如:2020-03-09T20:13:57.089Z并且我想在即时中找到第二天的结束时间,例如 - 2020-03-10T23:59:59.089Z(这将是与初始日期相比的第二天的结束时间)
如何使用 Java 中的 Instant 来做到这一点?
我对 Java 8 还很陌生,所以这个问题可能有一个明显的答案,但在阅读了其他类似的 SO 问题后,我找不到任何导致我的问题的相似之处。
这是我的班级:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class LocalDateTimeIssue {
public static void main(String[] args) {
String dateTimeString = "18-04-2019 12:14:46";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm:ss", Locale.US);
LocalDateTime ldt = LocalDateTime.parse(dateTimeString , dtf);
System.out.println(ldt.getSecond());
}
}
Run Code Online (Sandbox Code Playgroud)
这会引发以下异常:
Exception in thread "main" java.time.format.DateTimeParseException: Text '18-04-2019 12:14:46' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {MilliOfSecond=0, MinuteOfHour=14, HourOfAmPm=0, NanoOfSecond=0, MicroOfSecond=0, SecondOfMinute=46},ISO resolved to 2019-04-18 of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1855)
at java.time.LocalDateTime.parse(LocalDateTime.java:492) …Run Code Online (Sandbox Code Playgroud) 我以前能够使用 Joda DateTime 对象执行此操作,但我不确定如何获取应用了时区的 ZonedDateTime 实例的给定月份的最后一天。
例如
在 Jodatime 中,我使用了dayOfMonth()and getMaximumValue(),但是如何ZonedDateTime在Java 11中使用 和 进行等效操作?