标签: java-time

使用Java 8在几分钟内完成

所以我很幸运能够使用Java 8和新的时间APi,但我没有看到任何舍入函数......

基本上如果时间是......

2014-08-28T10:01.00.000 ----> 2014-08-28T10:02.00.000
2014-08-28T10:01.10.123 ----> 2014-08-28T10:02.00.000
2014-08-28T10:01.25.123 ----> 2014-08-28T10:02.00.000
2014-08-28T10:01.49.123 ----> 2014-08-28T10:02.00.000
2014-08-28T10:01.59.999 ----> 2014-08-28T10:02.00.000
Run Code Online (Sandbox Code Playgroud)

这似乎没问题,但是对吗?

LocalDateTime now =  LocalDateTime.now(Clock.systemUTC());
LocalDateTime newTime =  now.plusMinutes(1);

System.out.println(newTime.toString());
System.out.println(newTime.format(DateTimeFormatter.ofPattern("yyyy-dd-MM'T'HH:mm:00.000")));
Run Code Online (Sandbox Code Playgroud)

datetime rounding ceil java-8 java-time

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

如何从模式创建Java时间瞬间?

考虑一下代码:

TemporalAccessor date = DateTimeFormatter.ofPattern("yyyy-MM-dd").parse("9999-12-31");
Instant.from(date);
Run Code Online (Sandbox Code Playgroud)

最后一行抛出异常:

Unable to obtain Instant from TemporalAccessor: {},ISO resolved to 9999-12-31 of type java.time.format.Parsed
Run Code Online (Sandbox Code Playgroud)

如何Instantyyyy-MM-dd模式创建?

java java-time

32
推荐指数
3
解决办法
6万
查看次数

Java SE 8 TemporalAccessor.from与java.time.Instant对象一起使用时出现问题

java.time有一个Instant类,它封装了时间轴上的位置(或"时刻").虽然我知道这是秒/纳秒值,因此与时区或时间偏移没有直接关系,但它toString返回格式为UTC日期/时间的日期和时间,例如2014-05-13T20:05:08.556Z.此外anInstant.atZone(zone),anInstant.atOffset(offset)两者都产生一个值,该值与将Instant具有隐含的UTC时区/"零"偏移量视为一致.

因此我原以为:

  • ZoneOffset.from(anInstant) 产生'零' ZoneOffset
  • OffsetDateTime.from(anInstant) 产生一个'零'偏移的日期/时间
  • ZoneId.from(anInstant) (可能)生成UTC ZoneId
  • ZonedDateTime.from(anInstant)(可能)ZonedDateTime用UTC 生成一个ZoneId

ZonedDateTime.from正如我所读到的那样,该文件似乎赞同这一点.

事实上ZoneOffset.from(anInstant)失败了DateTimeException,我想因为这个原因OffsetDateTime.from(anInstant)也失败了,其他两个也失败了.

这是预期的行为吗?

java java-8 java-time

30
推荐指数
3
解决办法
3万
查看次数

使用新的java.time API解析时区的速度非常慢

我只是将模块从旧的Java日期迁移到新的java.time API,并注意到性能大幅下降.它归结为用时区解析日期(我一次解析数百万个).

解析没有时区(yyyy/MM/dd HH:mm:ss)的日期字符串很快 - 比旧的Java日期快2倍,在我的电脑上每秒约1.5M操作.

但是,当模式包含时区(yyyy/MM/dd HH:mm:ss z)时,使用新java.timeAPI 的性能下降约15倍,而使用旧API时,性能与没有时区的速度一样快.请参阅下面的性能基准.

有没有人知道我是否能以某种方式使用新的java.timeAPI 快速解析这些字符串?目前,作为一种解决方法,我使用旧的API进行解析,然后将其转换Date为Instant,这不是特别好.

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.concurrent.TimeUnit;

import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OperationsPerInvocation;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.infra.Blackhole;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

@OutputTimeUnit(TimeUnit.MILLISECONDS)
@BenchmarkMode(Mode.AverageTime)
@OperationsPerInvocation(1)
@Fork(1)
@Warmup(iterations = 3)
@Measurement(iterations = 5)
@State(Scope.Thread)
public class DateParsingBenchmark {

    private final int …
Run Code Online (Sandbox Code Playgroud)

java performance java-8 jmh java-time

30
推荐指数
2
解决办法
2195
查看次数

如何在java中获得前一个月和几年?

如何在java中找出上个月和它的年份

例如,如果今天是2012年10月10日,结果应该是月= 9和年= 2012,如果今天是2013年1月10日,结果应该是月= 12和年= 2012

java calendar java-time

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

是否有JDK8 java.time的jackson数据类型模块?

我正在为新的JDK8 java.time类寻找一个模块.我查看了FasterXML GitHub项目列表,目前没有找到.

据我所知,Jackson仍然是针对JDK6编译的,所以不能直接使用这些类,并且必须将它构建为一个单独的模块,正如Joda所要求的那样.

我不介意启动这个项目,但是看看是否还有其他工作正在进行中.

jackson java-8 jackson-modules java-time

28
推荐指数
4
解决办法
4万
查看次数

如何在没有JDBC 4.2驱动程序的情况下从java.sql.Timestamp获取java.time对象?

通过JDBC 4.1或更早版本从数据库中检索java.sql.Timestamp时,如何获取/转换为java.time对象?

Postgres的开源JDBC驱动程序都没有兼容JDBC 4.2,所以我正在寻找一种方法来使用java.time和JDBC 4.1.

java datetime jdbc java-time

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

这个错误是什么意思?java.lang.reflect.InaccessibleObjectException:无法将字段设为私有final int java.time.LocalDate.year

我正在尝试创建一种方法,该方法使用 Json 数据和 jackson 库来获取对象列表。如果我运行我的代码,我会收到错误:

java.lang.reflect.InaccessibleObjectException:无法使字段私有final int java.time.LocalDate.year可访问:模块java.base不会“打开java.time”到未命名模块@5c90e579

即使我的代码中有 JodaModul,为什么它会给我一个关于 LocalDate 的错误?

public static List<Tweet> getTweetsFile() throws Exception{

            ObjectMapper mapper = new ObjectMapper().
                    registerModule(new JodaModule()).
                    configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
            
            File path = new File ("C:/Users/PC/eclipse-workspace/hw4/tw.json");

            List<Tweet> myObjects3 =  Arrays.asList(mapper.readValue(path, Tweet.class));
    
            return myObjects3;
    }
Run Code Online (Sandbox Code Playgroud)

它在我的文件中的样子:

[{"date":"2001-12-28","tweetNumber":1,"country":"England","comments":11,"message":"I like to watch anime and reading books","retweets":3,"username":"Isabelle","likes":55},{"date":"2003-05-11","tweetNumber":2,"country":"France","comments":25,"message":"I'm Viatnamese, but I live in France","retweets":30,"username":"Vin","likes":110}..
Run Code Online (Sandbox Code Playgroud)

它的顺序不正确,就像我的对象在其构造函数中的顺序一样,这可能是原因吗?

java jackson java-time

28
推荐指数
4
解决办法
7万
查看次数

JSR-310 - 解析具有可变长度的秒分数

有没有办法如何创建JSR-310格式化程序,能够用可变长度的秒分数解析以下日期/时间?

2015-05-07 13:20:22.276052
Run Code Online (Sandbox Code Playgroud)

要么

2015-05-07 13:20:22.276
Run Code Online (Sandbox Code Playgroud)

示例代码:

DateTimeFormatter formatter
= new java.time.format.DateTimeFormatterBuilder()
        .append( java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") )
        .appendOptional( java.time.format.DateTimeFormatter.ofPattern(".SSSSSS") )
        .toFormatter();
formatter.parse("2015-05-07 13:20:22.276052", LocalDateTime::from);
Run Code Online (Sandbox Code Playgroud)

java java-time

27
推荐指数
1
解决办法
5342
查看次数

LocalDateTime到ZonedDateTime

我有Java 8 Spring网络应用程序,它将支持多个区域.我需要为客户位置制作日历活动.因此,假设我的网站和Postgres服务器托管在MST时区(但我想如果我们去云端,它可能就在任何地方).但客户是在美国东部时间.所以,按照我读到的一些最佳实践,我想我会以UTC格式存储所有日期时间.数据库中的所有日期时间字段都声明为TIMESTAMP.

所以这是我如何采用LocalDateTime并转换为UTC:

ZonedDateTime startZonedDT = ZonedDateTime.ofLocal(dto.getStartDateTime(), ZoneOffset.UTC, null);
//appointment startDateTime is a LocalDateTime
appointment.setStartDateTime( startZonedDT.toLocalDateTime() );
Run Code Online (Sandbox Code Playgroud)

现在,例如,当搜索日期时,我必须从请求的日期时间转换为UTC,获取结果并转换为用户时区(存储在数据库中):

ZoneId  userTimeZone = ZoneId.of(timeZone.getID());
ZonedDateTime startZonedDT = ZonedDateTime.ofLocal(appointment.getStartDateTime(), userTimeZone, null);
dto.setStartDateTime( startZonedDT.toLocalDateTime() );
Run Code Online (Sandbox Code Playgroud)

现在,我不确定这是正确的方法.我也想知道如果因为我从LocalDateTime到ZonedDateTime,反之亦然,我可能会失去任何时区信息.

这是我所看到的,这对我来说似乎不正确.当我从UI收到LocalDateTime时,我得到了这个:

2016-04-04T08:00
Run Code Online (Sandbox Code Playgroud)

ZonedDateTime =

dateTime=2016-04-04T08:00
offset="Z"
zone="Z"
Run Code Online (Sandbox Code Playgroud)

然后,当我将转换后的值分配给我的约会LocalDateTime时,我存储:

2016-04-04T08:00
Run Code Online (Sandbox Code Playgroud)

我觉得因为我存储在LocalDateTime中我失去了转换为ZonedDateTime的时区.

我应该让我的实体(约会)使用ZonedDateTime而不是LocalDateTime,以便Postgres不会丢失该信息吗?

---------------- 编辑 ----------------

在Basils出色的答案之后,我意识到我很不喜欢用户时区 - 所有约会都是针对特定位置的,因此我可以将所有日期时间存储为UTC,然后在检索时将它们转换为位置时区.我提出了以下后续问题

java spring-data-jpa postgresql-9.3 java-time

27
推荐指数
2
解决办法
3万
查看次数