标签: java-time

java.util.Date计算天数差异

我试着计算两个日期之间的差异,我注意到了一件事.仅计算天数时,夏令时的开始时间包含在间隔中,因此结果将在1天内缩短.

要获得准确的结果,还必须考虑小时值.

例如:

SimpleDateFormat format = new SimpleDateFormat("MM-dd-yyyy");
Date dfrom = format.parse("03-29-2015");
Date dto = format.parse("03-30-2015");
long diff = dto.getTime() - dfrom.getTime();
System.out.println(diff);
System.out.println("Days: "+diff / (24 * 60 * 60 * 1000));
System.out.println("Hours: "+diff / (60 * 60 * 1000) % 24);
Run Code Online (Sandbox Code Playgroud)

输出:

82800000
Days: 0
Hours: 23
Run Code Online (Sandbox Code Playgroud)

有人有更好的解决方案吗?

java date days dst java-time

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

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:当秒和毫秒都为 0 时,DateTimeFormatter 无法解析时间字符串?

基本上,我使用以下代码将字符串解析为 LocalDateTime,它在大多数情况下都可以正常工作。

DateTimeFormatter dtformatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
Run Code Online (Sandbox Code Playgroud)

但是,我遇到秒和毫秒的情况00000,这是解析器失败并打印 aLocalDateTime 2018-03-01T09:16而不是2018-03-01T09:16:00.000.

System.out.println(LocalDateTime.parse("20180301091600000",dtformatter));
Run Code Online (Sandbox Code Playgroud)

(请注意,在我的代码中,我必须将字符串解析为LocalDateTime,进行一些比较,然后在最后打印LocalDateTime到 csv)

如何修复它以使其打印2018-03-01T09:16:00.000而不是打印2018-03-01T09:16?

仅供参考,我正在使用 jdk10。

java format date java-time java-10

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

当我将 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
查看次数