标签: java-time

LocalDateTime.parse()只带有模式数字

我想从以下模式解析LocalDateTime:

yyyyMMddHHmmss000000
Run Code Online (Sandbox Code Playgroud)

这意味着通常的"yyyy ... ss"然后是六个尾随的零.

因此,格式化工作正常:

String p = "yyyyMMddHHmmss'000000'";
LocalDateTime.now().format(DateTimeFormatter.ofPattern(p));
Run Code Online (Sandbox Code Playgroud)

然后解析:

String p, v;
p = "yyyyMMddHHmmss";                                    // without '000000'
v = "20160131235930";
LocalDateTime.parse(v, DateTimeFormatter.ofPattern(p));  // it works


p = "yyyy-MMddHHmmss'000000'";                           // with '-' in between
v = "2016-0131235930000000";
LocalDateTime.parse(v, DateTimeFormatter.ofPattern(p));  // it works


p = "yyyyMMddHHmmss'000000'";                            // with '000000' but without '-'
v = "20160131235930000000";
LocalDateTime.parse(v, DateTimeFormatter.ofPattern(p));  // it throws Exception
Run Code Online (Sandbox Code Playgroud)

例外情况:

java.time.format.DateTimeParseException: Text '20160131235930000000' could not be parsed at index 0
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849)
at java.time.LocalDateTime.parse(LocalDateTime.java:492) …
Run Code Online (Sandbox Code Playgroud)

java datetime parsing java-8 java-time

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

Java 8 LocalDateTime舍入到下一个X分钟

我想将Java 8 LocalDateTime转换为最接近的5分钟.例如

1601  ->  1605
1602  ->  1605
1603  ->  1605
1604  ->  1605
1605  ->  1605
1606  ->  1610
1607  ->  1610
1608  ->  1610
1609  ->  1610
1610  ->  1610
Run Code Online (Sandbox Code Playgroud)

我想使用LocalDateTime或Math api的现有功能.有什么建议?

math datetime date java-8 java-time

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

如何使用可选的秒参数创建DateTimeformatter

我正在尝试创建一个DateTimeformatter以验证以下日期时间:

String date1 = "2017-07-06T17:25:28";
String date2 = "2017-07-06T17:25:28.1";
String date3 = "2017-07-06T17:25:28.12";
String date4 = "2017-07-06T17:25:28.123";
String date5 = "2017-07-06T17:25:28.1234";
String date6 = "2017-07-06T17:25:28.12345";
String date7 = "2017-07-06T17:25:28.123456";
String date8 = "2017-07-06T17:25:28.";
Run Code Online (Sandbox Code Playgroud)

我已尝试使用以下日期时间格式器来验证上述日期:

public static final String DATE_TIME_FORMAT_PATTERN = "yyyy-MM-dd'T'HH:mm:ss";
DateTimeFormatter formatter1 = new DateTimeFormatterBuilder()
                                   .appendPattern(DATE_TIME_FORMAT_PATTERN)
                                   .appendFraction(ChronoField.MICRO_OF_SECOND, 0, 6, true)
                                   .toFormatter();
Run Code Online (Sandbox Code Playgroud)

它工作正常,所有上述日期,但根据我的要求就应该失败java.time.format.DateTimeParseException的date8.

注意:我知道我可以使用以下格式化程序获得预期的结果:

DateTimeFormatter formatter2 = DateTimeFormatter
                       .ofPattern("yyyy-MM-dd'T'HH:mm:ss[.SSSSSS][.SSSSS][.SSSS][.SSS][.SS][.S]");
Run Code Online (Sandbox Code Playgroud)

但我想知道我们可以通过改变来实现预期的结果formatter1吗?

要解析我使用的日期:

LocalDateTime.parse(date1, formatter1);
Run Code Online (Sandbox Code Playgroud)

java datetime-parsing java-8 java-time

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

将java.util.Date截断为LocalDate,而不必将inTunst()截断,因为java.sql.Date提供了UnsupportedOperationException

如果我用java.util.Date的toInstant()上这恰好是一个变量java.sql.Date,我得到一个UnsupportedOperationException。

try {
    java.util.Date input = new java.sql.Date(System.currentTimeMillis());
    LocalDate date = input.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
} catch (UnsupportedOperationException e) {
    // grrr!
}
Run Code Online (Sandbox Code Playgroud)

的java.util.Date,我很担心经由传统API的MySQL数据库来自一个日期字段,而实际上是一个java.sql.Date。

现在,以下相关问题都很有趣:

UnsupportedOperationException-为什么不能在java.sql.Date上调用toInstant()?

将java.util.Date转换为java.time.LocalDate

LocalDate到java.util.Date的转换,反之亦然?

但它们没有提供任何截断a的优雅方法java.util.Date来摆脱时间成分并获得Java 8 LocalDate。

我承认存在一个问题,一个时区中的同一时刻可能与另一时区中的同一时刻的日期不同。

我怀疑解决方案将涉及java.util.Calendar,但与其设计我自己的解决方案,不如先确定其他人已经做的事情。

我希望找到比这短的东西:

从在Java中重置时间戳的时间部分开始:

Date date = new Date();                      // timestamp now
Calendar cal = Calendar.getInstance();       // get calendar instance
cal.setTime(date);                           // set cal to date
cal.set(Calendar.HOUR_OF_DAY, 0);            // set hour to midnight
cal.set(Calendar.MINUTE, 0); …
Run Code Online (Sandbox Code Playgroud)

java datetime date date-conversion java-time

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

具有多种格式的Moshi LocalDateTime适配器

默认情况下,ThreeTenABP.LocalDateTime将转换为

{"date":{"day":10,"month":4,"year":2018},"time":{"hour":3,"minute":34,"nano":115000000,"second":18}}

我可以写一个适配器来支持ISO日期字符串 2018-04-10T03:45:26.009

class LocalDateTimeAdapter {
    @ToJson
    fun toJson(value: LocalDateTime): String {
        return FORMATTER.format(value)
    }

    @FromJson
    fun fromJson(value: String): LocalDateTime {
        return FORMATTER.parse(value, LocalDateTime.FROM)
    }

    companion object {
        private val FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME
    }
}
Run Code Online (Sandbox Code Playgroud)

如何编写可以支持这两种格式的适配器(fromJson)

  • {"date":{"day":10,"month":4,"year":2018},"time":{"hour":3,"minute":34,"nano":115000000,"second":18}}
  • 2018-04-10T03:45:26.009

除了确定使用哪种格式之外fromJson,我很好奇Moshi如何在内部为LocalDateTime执行toJson/fromJson

kotlin java-time moshi

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

在Java中更改`DateTimeFormatter`模式> 8

运行:

Locale locale = Locale.US;
String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
        FormatStyle.LONG, 
        FormatStyle.LONG,
        Chronology.ofLocale(locale), 
        locale);
System.out.println("pattern: " + pattern);
Run Code Online (Sandbox Code Playgroud)

输出:

pattern: MMMM d, yyyy h:mm:ss a z   // Java  8.0.171-oracle
pattern: MMMM d, y 'at' h:mm:ss a z // Java 11.0.0-open
Run Code Online (Sandbox Code Playgroud)

我发现Oracle使用iana-tz数据库(https://data.iana.org/time-zones/tz-link.html)来管理时区数据(请参阅https://www.oracle.com/technetwork/java /javase/tzdata-versions-138805.html).

但是,我没有发现任何关于标准日期格式的更改.调查源代码,似乎在Java 8中,该函数LocaleResources.getJavaTimeFormatData()加载了sun.text.resourcesbundle,而在Java 11中,它加载了sun.text.resources.cdlrbundle.

我的问题是:这样的变化是否记录在某个地方,可能是有原因的?

此外,确保与现有数据库兼容的最佳方法是什么?现在,我们有一个已识别模式的列表,所以我正在考虑通过解析新模式将旧模式添加到我的可识别模式列表中.

另一个值得注意的变化是:

Locale locale = Locale.US;
String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
        FormatStyle.SHORT, FormatStyle.MEDIUM, Chronology.ofLocale(locale), locale);
System.out.println("pattern: " + pattern);
Run Code Online (Sandbox Code Playgroud)

输出:

pattern: M/d/yy h:mm:ss a  // Java …
Run Code Online (Sandbox Code Playgroud)

java datetime-format java-time

6
推荐指数
0
解决办法
355
查看次数

当我将 LocalDate 格式化为 dd.MMM.YYYY 时,我得到 01.Jan..2000,带有两个点

我正在尝试将LocalDate变量格式化为dd.MMM.YYYY:

DateTimeFormatter.ofPattern("dd.MMM.yyyy")
Run Code Online (Sandbox Code Playgroud)

问题是,超过一半的时间我得到两个点。例如01-01-2000转到01.Jan..2000.

我知道为什么我会遇到这个问题,因为这三个Ms。当我使用时dd.MM.yyyy,我没有01.01.2000问题。第三M是问题。

我怎样才能解决这个问题?

java date-formatting java-time

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

ZonedDateTime 格式和解析格式模式中带有“z”的异常

我在解析时遇到问题ZonedDateTime:

DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-ddzhh:mm");
ZonedDateTime.parse(s, formatter);
Run Code Online (Sandbox Code Playgroud)

这会导致错误:

java.time.format.DateTimeParseException:
    Text '2022-05-24UTC12:15' could not be parsed at index 10
Run Code Online (Sandbox Code Playgroud)

这段代码有什么问题吗?

java datetime-parsing java-time zoneddatetime datetimeparseexception

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

如何从 long+TimeUnit 转换为 Duration?

我正在将一些签名从 迁移f(long dur, TimeUnit timeUnit)到f(Duration duration),并希望用后者来实现前者。

在 Java 8 上,我找不到任何 API 可以轻松地将long+转换TU为 a Duration,我唯一的想法就是做一些丑陋的事情,例如:

static Duration convert(long dur, TimeUnit timeUnit) {
  switch (timeUnit) {
    case DAYS:
      return Duration.ofDays(dur);
    case HOURS:
      /* alternative, but (again) I don't have an easy conversion from TimeUnit -> ChronoUnit */
      return Duration.of(dur, ChronoUnit.HOURS);
    case ..... /* and so on */
  }
}
Run Code Online (Sandbox Code Playgroud)

或者我错过了一些API?

java java-8 timeunit java-time chronounit

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

了解 ZonedDateTime::plusDays 的 javadoc

我无法理解为 ZonedDateTimeClass 中的 plusDays() 方法提供的文档的特定部分。文件指出:

\n
\n

返回添加了指定天数的此 ZonedDateTime 的副本。

\n

这在本地时间线上运行,将天数添加到本地日期时间。然后使用区域 ID 获取偏移量,将其转换回 ZonedDateTime。

\n

当转换回 ZonedDateTime 时,如果本地日期时间处于重叠状态,则如果可能,将保留偏移量,否则将使用较早的偏移量。如果存在间隙,则本地日期时间将向前调整\n间隙的长度。

\n

该实例是不可变的并且不受该方法调用的影响。

\n

参数:days \xe2\x80\x93 要添加的天数,可以为负数

\n

返回:基于此日期时间并添加了天数的 ZonedDateTime,\n不为 null

\n

抛出: DateTimeException \xe2\x80\x93 如果结果超出支持的日期\n范围

\n
\n

我的理解是:假设我们有 ZonedDateTime 对象代表September 4, 2022 6 PM in America/New_York TimeZone. 所以这个方法会先将其转换为LocalDateTime,即会丢失时区信息,只保留September 4, 2022 6 PM。它将向其添加一些天数,假设为 7,以便结果为September 11, 2022 6 PM,现在它将通过提供与时区相关的信息将其转换回 ZonedDateTime 对象。

\n

但是,我无法理解文档的后半部分,即

\n
\n

当转换回 ZonedDateTime 时,如果本地日期时间处于重叠状态,则如果可能,将保留偏移量,否则将使用较早的偏移量。如果存在间隙,则本地日期时间将向前调整\n间隙的长度。

\n
\n

他们的意思是什么local date-time is in an overlap …

java datetime java-time

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