标签: java-time

DateTimeFormatter 不解析自定义日期格式

我有一个关于 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.

java datetime datetime-parsing java-time

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

如何在 Java 中向时间戳添加/减去时区偏移量?

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 timezone datetime timezone-offset java-time

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

将 org.joda.time.Period 转换为 java.time.Period

我正在尝试用 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)

java java-time

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

如果删除空格,DateTimeFormatter 解析具有可选时间部分的字符串将失败

在我的另一个关于如何将仅日期字符串解析为 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 模式。

java java-8 java-time

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

将 LocalDate 和 LocalDateTime 序列化为 Unix 时间戳

我正在从在 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)

java spring spring-mvc jackson java-time

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

Java 8:DateTimeFormatter 不根据区域设置转换时区

我正在使用 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));\n
Run Code Online (Sandbox Code Playgroud)\n\n

代码输出:

\n\n
jeudi 3 d\xc3\xa9cembre 2015 18 h 15 EST\n
Run Code Online (Sandbox Code Playgroud)\n\n

如何将时区从 EST 翻译为法语 HNE (Heure Normale de l\'Est)?

\n\n

任何帮助将不胜感激。

\n

java timezone locale java-time dateformatter

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

IST 映射到 java.time 库中错误的 ZoneId

我正在尝试从格式为 (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)

我在这里错过了什么吗?

java java-time

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

如何从给定的 Instant 获取第二天的日期结束时间?(爪哇)

我有一个即时日期,例如:2020-03-09T20:13:57.089Z并且我想在即时中找到第二天的结束时间,例如 - 2020-03-10T23:59:59.089Z(这将是与初始日期相比的第二天的结束时间)

如何使用 Java 中的 Instant 来做到这一点?

java time date java-time

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

无法从 TemporalAccessor 获取 LocalTime

我对 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)

java java-time

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

从 ZonedDateTime 对象获取该月的最后一天

我以前能够使用 Joda DateTime 对象执行此操作,但我不确定如何获取应用了时区的 ZonedDateTime 实例的给定月份的最后一天。

例如

  • 闰年二月回归29
  • 四月回归30。
  • 12 月返回 31。

在 Jodatime 中,我使用了dayOfMonth()and getMaximumValue(),但是如何ZonedDateTime在Java 11中使用 和 进行等效操作?

java java-time zoneddatetime dayofmonth

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