标签: java-time

为什么Temporal不能在Java 8 jsr310中扩展Comparable

java.time.temporal.Temporal的文档包含以下注释:

实施要求:[...]所有实施必须是可比较的.

为什么Temporal不仅仅扩展可比性?

背景:我想使用类似的时间(不是像LocalDateTime等子类型),并且必须采用一种有点难以辨认的类型<T extends Temporal & Comparable<T>>,这也会混淆NetBeans的自动完成功能.

编辑:我想实现一个时间间隔.包含(Interval i),包含(Temporal t),重叠(...),adjoins(...)等的明显实现使用Comparable :: compareTo(Comparable c)来比较起点和终点,但是互操作性(toDuration(),parse(CharSequence cs))我需要例如Duration :: between(Temporal s,Temporal e)或SubtypeOfTemporal :: parse(CharSequence cs)(产生Temporal).

java java-8 java-time

10
推荐指数
3
解决办法
1527
查看次数

Java LocalDateTime解析错误

尝试了4个小时来解决这个问题.

:这很有效

String date = "Jul-01-2014 09:10:12";
LocalDateTime dt = LocalDateTime.parse(date, DateTimeFormatter.ofPattern("MMM-dd-yyyy HH:mm:ss", Locale.US));
Run Code Online (Sandbox Code Playgroud)

:这不会

String date = "JUL-01-2014 09:10:12";
LocalDateTime dt = LocalDateTime.parse(date, DateTimeFormatter.ofPattern("MMM-dd-yyyy HH:mm:ss", Locale.US));
Run Code Online (Sandbox Code Playgroud)

唯一的区别是所有资本化的月份.七月的正确案例.JUL或jul都不会起作用.我也试过'LLL'模式没有运气.我错过了什么?

java date java-time

10
推荐指数
2
解决办法
2371
查看次数

使用新的dateTime API获取持续时间

我想得到一个java.time.Duration代表3年持续时间的实例,
我找到了两种方法(见下面的代码).

public static void main(String[] args) {
    Duration d1 = Duration.of(3, ChronoUnit.YEARS); //Runtime Exception
    Duration d2 = ChronoUnit.YEARS.getDuration().multipliedBy(3);

    System.out.println("d2="+d2.toDays()); //OUTPUT: d2=1095
}
Run Code Online (Sandbox Code Playgroud)

第一种方法是,d1在运行时抛出以下异常:

Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unit must not have an estimated duration
    at java.time.Duration.plus(Unknown Source)
    at java.time.Duration.of(Unknown Source)
    at mod7.vehicalc.Test.main(Test.java:26)

第二种方式,d2按预期工作.

造成这种差异的原因是什么?

java datetime java-8 java-time

9
推荐指数
2
解决办法
3169
查看次数

根据年份和年份获取LocalDateTime

我有两个整数:year和week.我想LocalDateTime从这两个值构造一个,其中日期代表特定年份中特定周的第一天.

我已经尝试过了:

LocalDateTime ldt = LocalDateTime.of(year, 1, 1, 0, 0).plusWeeks(week-1);
Run Code Online (Sandbox Code Playgroud)

这没有给出正确的结果,因为一年的第一天并不总是该年第一周的开始.我似乎无法弄清楚如何获得第一周的第一天.

使用Java 8中的Date和Time API有没有简单的方法呢?

注:我知道我还可以创建一个给定的答案一种解决方法在这里,但这似乎牵强.也许不是,如果是的话,请告诉我!

java datetime java-8 java-time

9
推荐指数
1
解决办法
4962
查看次数

计算从闰年之间的年份

在计算两个日期之间的年份时,第二个日期是从第一个日期开始计算的(这是我正在研究的一个简化示例),LocalDate并且Period似乎计算一年略有不同.

例如,

LocalDate date = LocalDate.of(1996, 2, 29);
LocalDate plusYear = date.plusYears(1);
System.out.println(Period.between(date, plusYear).getYears());
Run Code Online (Sandbox Code Playgroud)

而

LocalDate date = LocalDate.of(1996, 3, 29);
LocalDate plusYear = date.plusYears(1);
System.out.println(Period.between(date, plusYear).getYears());
Run Code Online (Sandbox Code Playgroud)

尽管明确增加了一年,但第一次Period返回的年份为0第二种情况1.

这有什么好的方法吗?

java leap-year java-8 java-time

9
推荐指数
1
解决办法
456
查看次数

Java 8偏移日期解析

我需要将以下格式的String解析为2015-01-15-05:00UTC中的LocalDate(或其他).问题是以下代码:

System.out.println(LocalDate.parse("2015-01-15-05:00", DateTimeFormatter.ISO_OFFSET_DATE));
Run Code Online (Sandbox Code Playgroud)

输出2015-01-15忽略偏移量.期望的输出是2015-01-16

提前致谢!

java timezone-offset java-8 java-time

9
推荐指数
1
解决办法
3558
查看次数

获取特定时区中的当前 Instant

我试图在特定时区获取当前实例,但它没有按预期工作。关于如何做到这一点的任何想法?

这是我所做的:

Instant.now(Clock.system(ZoneId.of("America/Los_Angeles"))).truncatedTo(ChronoUnit.SECONDS)
Run Code Online (Sandbox Code Playgroud)

但是,返回的即时时间始终是 UTC。我多次更改 ZoneID 并且总是错误。请指教。

编辑:

我正在与使用 timeStamp 生成日志的应用程序进行交互,我需要对这些事件进行操作。立即,如果我使用特定的时间戳启动我的程序,它应该从该时间戳开始读取事件。虽然我的笔记本电脑与生成这些事件的应用程序在同一个时区,但当我得到 Instant.Now() 时,我似乎在 UTC 中。而应用程序根据我们所在的时区生成时间戳。我希望我的程序的时钟与服务器中的时钟相同。

应用程序生成 2016-08-04T18:17:51Z 形式的时间戳

java scala java-8 java-time

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

TZupdater失败了tzdata2016g版本

TZUpdater 2.1.0因tzdata2016g版本而失败.对于Java 8,它失败了,"源目录不包含file:VERSION"错误,而它完成了Java 7的"JRE updated to version:tzdataunknown"注释.

这样做的原因似乎是IANA tzdata发布的最近更改:取消设置Makefile的VERSION字段.有关此问题的报告存在错误:https://bugs.openjdk.java.net/browse/JDK-8166928.

DST日期(2016年10月30日)越来越近,我们至少需要一个解决方法.不知何故,这可能吗?

java timezone timezone-offset java-time

9
推荐指数
2
解决办法
3535
查看次数

Instant Time 解析错误(无法从 TemporalAccessor 获取 Instant)

运行我的程序后,我在运行大约 2 小时后发生了奇怪的崩溃,说明它无法解析日期。

Text '2016-10-26T12:31:39.084726218Z' could not be parsed: Unable to obtain Instant from TemporalAccessor: {InstantSeconds=1477485099, NanoOfSecond=84726218},ISO of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1919)
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么会这样?因为在网上查找时,我发现这可能是由于格式不正确造成的,但由于我没有指定格式,所以对我来说情况并非如此。

解析我的时间戳的代码如下:

Instant instant = Instant.parse(cAdvisor.getTimestamp());
Long epoch = instant.getEpochSecond();
Run Code Online (Sandbox Code Playgroud)

注意:该cAdvisor.getTimestamp()方法返回一个字符串,例如:'2016-10-26T12:31:39.084726218Z'

注 2:我的 java 版本报告了这一点

java version "1.8.0-ea"
Java(TM) SE Runtime Environment (build 1.8.0-ea-b115)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b57, mixed mode)
Run Code Online (Sandbox Code Playgroud)

更新 #1:以下代码复制了此问题:

import java.time.Instant;
import java.util.Random;

// one class needs to have a main() method
public class Test
{
    // arguments are …
Run Code Online (Sandbox Code Playgroud)

java java-time

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

相对于现有的抽象类 Clock,新接口 java.time.InstantSource 的主要目的是什么?

Java 17 中添加了一个新接口。java.time.InstantSource如果该接口的所有实现都是实现,那么该附加抽象的用例是什么Clock?

java java-time java.time.instant

9
推荐指数
1
解决办法
1131
查看次数