标签: java-time

为什么在1582之前将Java日期转换为使用Instant的LocalDate给出不同的日期?

考虑以下代码:

Date date = new SimpleDateFormat("MMddyyyy").parse("01011500");

LocalDate localDateRight = LocalDate.parse(formatter.format(date), dateFormatter);
LocalDate localDateWrong = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).toLocalDate();

System.out.println(date);           // Wed Jan 01 00:00:00 EST 1500
System.out.println(localDateRight); // 1500-01-01
System.out.println(localDateWrong); // 1500-01-10
Run Code Online (Sandbox Code Playgroud)

我知道1582年是Julian和Gregorian日历之间的截止点.我不知道为什么会发生这种情况,或者如何调整它.

这是我到目前为止所发现的:

  • 对象的BaseCalender设置为的日期JulianCalendar
  • date.toInstant() 回来 Instant.ofEpochMilli(getTime())
  • date.getTime() 返回-14830974000000
  • -14830974000000是Wed,10 Jan 1500 05:00:00 GMT Gregorian

所以似乎要么返回的毫秒getTime()是错误的(不太可能),要么与我预期的不同,我需要考虑差异.

java datetime date java-8 java-time

8
推荐指数
1
解决办法
1724
查看次数

用Clock.systemDefaultZone().millis()天真地替换System.currentTimeMillis()是否安全?

Java 8引入了java.time.Clock接口,它应该允许我有效地模拟系统时间调用(太棒了!).

我想天真地替换调用System.currentTimeMillis()与调用someClock.millis(),但目前尚不清楚,我认为这两个时钟实际上将根据给定的caviet所有情况下返回相同的价值观Clock.system*,他们使用"的状态文档...最好的系统时钟". System.currentTimeMillis()没有说明使用最佳可用时钟的任何类似声明.

java datetime java-time

8
推荐指数
1
解决办法
3378
查看次数

在Java 8中按句点解析ISO日期

我想替换JodaTime的Java 8 DateTime API.

我有ISO-8601句号描述=P2W5DT11H8M

在JodaTime我通过执行以下代码非常简单地解析它:

Period.parse("P2W5DT11H8M")我得到了成功的Period对象.

我可以在Java 8中做同样的事情吗?

java datetime jodatime java-8 java-time

8
推荐指数
2
解决办法
1023
查看次数

所有CAPS中的Java 8 DateTimeFormatter月份都无法正常工作

我正在尝试将日期时间字符串解析为LocalDateTime.但是,如果我发送所有大写月份的一个错误,是否有任何解决方法.这是下面的代码

@Test
public void testDateFormat(){
    DateTimeFormatter formatter= DateTimeFormatter.ofPattern("dd-MMM-yyyy HH:mm:ss");
    LocalDateTime dateTime = LocalDateTime.parse("04-NOV-2015 16:00:00", formatter); //if I send month Nov it works
    System.out.println(dateTime.getYear());
}
Run Code Online (Sandbox Code Playgroud)

同样适用于simpleDateFormat

@Test
public void testSimpleDateTime() throws ParseException{
    SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss");
    Date dateTime = format.parse("04-NOV-2015 16:00:00");
    System.out.println(dateTime.getTime());
}
Run Code Online (Sandbox Code Playgroud)

java java-8 java-time

8
推荐指数
1
解决办法
6819
查看次数

Instant.readObject方法"防御恶意流"是什么意思?

阅读Instant类的源代码,我碰到了这个方法

/**
 * Defend against malicious streams.
 *
 * @param s the stream to read
 * @throws InvalidObjectException always
 */
private void readObject(ObjectInputStream s) throws InvalidObjectException {
    throw new InvalidObjectException("Deserialization via serialization delegate");
}
Run Code Online (Sandbox Code Playgroud)

描述让我很好奇.什么是"恶意流"?这种方法如何防御呢?

java stream java-8 java-time

8
推荐指数
1
解决办法
174
查看次数

与课程文档相反,持续时间不支持DAYS

在Java 8及更高版本的java.time框架中,Duration该类说:

此类以秒和纳秒为单位模拟时间量或时间量.可以使用其他基于持续时间的单位访问它,例如分钟和小时.此外,该DAYS装置可以使用,并且被视为完全等于24小时,因此忽略了夏令时效果.

然而,当我调用get方法并传递时ChronoUnit.DAYS,抛出异常.

LocalTime start = LocalTime.of ( 0 , 0 , 0 ); // First moment of the day.
LocalTime stop = LocalTime.of ( 2 , 0 , 0 ); // 2 AM.

Duration duration = Duration.between ( start , stop );
long days = duration.get ( ChronoUnit.DAYS );
Run Code Online (Sandbox Code Playgroud)

线程"main"中的异常java.time.temporal.UnsupportedTemporalTypeException:不支持的单位:天

我误解了某些东西,还是滥用了这些课程?

java duration java-time

8
推荐指数
2
解决办法
647
查看次数

有效的方法让杰克逊将Java 8 Instant序列化为纪元毫秒?

使用带有Jackson JSON解析后端的Spring RestControllers,前端使用AngularJS.我正在寻找一种有效的方法让Jackson序列化一个Instant作为纪元毫秒,以便随后使用JavaScript代码.(在浏览器方面,我希望通过Angular的日期过滤器提供epoch ms :{{myInstantVal | date:'short' }}为我所需的日期格式.)

在Java方面,杰克逊将使用的吸气剂就是:

public Instant getMyInstantVal() { return myInstantVal; }
Run Code Online (Sandbox Code Playgroud)

序列化不会按原样运行,因为对于Instant ,jackson-datatype-jsr310默认不返回Epoch毫秒.我看着将@JsonFormat添加到上面的getter中以将Instant变形为前端可以使用的东西,但它遇到两个问题:(1)我可以提供它的模式显然仅限于SimpleDateFormat,它不提供"epoch milliseconds"选项,以及(2)当我尝试将Instant作为格式化日期发送到浏览器时,Jackson会抛出异常,因为@JsonFormat注释需要Instants的TimeZone属性,我不想硬编码因为它会因用户而异.

到目前为止我的解决方案(并且工作正常)是使用@JsonGetter创建替换的getter ,这会导致Jackson使用此方法来序列化myInstantVal:

@JsonGetter("myInstantVal")
public long getMyInstantValEpoch() {
    return myInstantVal.toEpochMilli();
}
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?或者是否有一个很好的注释,我错过了我可以放在getMyInstantVal()所以我不必创建这些额外的方法?

spring json jackson angularjs java-time

8
推荐指数
2
解决办法
5350
查看次数

java.time API如何确定政府更改区域规则?

我不住在使用夏令时的国家.

  1. 我保存了未来 LocalDateTime,从UTC和ZoneIdDB中保留了偏移量
  2. 该区域的政府更改了DST规则
  3. 未来的时间到了,我将检索该LocalDateTime区域

如果我申请ZoneId和偏移以获得该LocalDateTime区域,java.timeAPI 如何正确得到这个?它如何知道政府改变规则?它是否从互联网上获取更新?

java time datetime dst java-time

8
推荐指数
1
解决办法
169
查看次数

Java 8 Time API - ZonedDateTime - 在解析时指定默认的ZoneId

我正在尝试编写一个泛型方法来返回ZonedDateTime给定的日期String及其格式.

如果未在日期中指定,我们如何ZonedDateTime使用默认值?ZoneIdString

它可以用java.util.Calendar,但我想使用Java 8时间API.

这里的问题是使用固定的时区.我将格式指定为参数.日期及其格式都是String参数.更通用.

代码和输出如下:

public class DateUtil {
    /** Convert a given String to ZonedDateTime. Use default Zone in string does not have zone.  */
    public ZonedDateTime parseToZonedDateTime(String date, String dateFormat) {
        //use java.time from java 8
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dateFormat);
        ZonedDateTime zonedDateTime = ZonedDateTime.parse(date, formatter);
        return zonedDateTime;
    }

    public static void main(String args[]) {
        DateUtil dateUtil = new DateUtil();
        System.out.println(dateUtil.parseToZonedDateTime("2017-09-14 15:00:00+0530", "yyyy-MM-dd HH:mm:ssZ"));
        System.out.println(dateUtil.parseToZonedDateTime("2017-09-14 …
Run Code Online (Sandbox Code Playgroud)

java timezone datetime-parsing java-time zoneddatetime

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

将Period添加到startDate不会产生endDate

我有两个LocalDate声明如下:

val startDate = LocalDate.of(2019, 10, 31)  // 2019-10-31
val endDate = LocalDate.of(2019, 9, 30)     // 2019-09-30
Run Code Online (Sandbox Code Playgroud)

然后我使用Period.between函数计算它们之间的周期:

val period = Period.between(startDate, endDate) // P-1M-1D
Run Code Online (Sandbox Code Playgroud)

此处的期间为负数的月份和天数,如果endDate早于,则可以预期startDate。

但是,当我将其添加period回时startDate,得到的结果不是endDate,而是前一天的日期:

val endDate1 = startDate.plus(period)  // 2019-09-29
Run Code Online (Sandbox Code Playgroud)

所以问题是,为什么不不变

startDate.plus(Period.between(startDate, endDate)) == endDate

保留这两个日期?

是Period.between谁返回了不正确的期限,还是LocalDate.plus谁添加了不正确的期限?

period date-difference kotlin java-time localdate

8
推荐指数
1
解决办法
194
查看次数