所以我很幸运能够使用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) 考虑一下代码:
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)
如何Instant从yyyy-MM-dd模式创建?
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 生成一个ZoneIdZonedDateTime.from正如我所读到的那样,该文件似乎赞同这一点.
事实上ZoneOffset.from(anInstant)失败了DateTimeException,我想因为这个原因OffsetDateTime.from(anInstant)也失败了,其他两个也失败了.
这是预期的行为吗?
我只是将模块从旧的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中找出上个月和它的年份
例如,如果今天是2012年10月10日,结果应该是月= 9和年= 2012,如果今天是2013年1月10日,结果应该是月= 12和年= 2012
我正在为新的JDK8 java.time类寻找一个模块.我查看了FasterXML GitHub项目列表,目前没有找到.
据我所知,Jackson仍然是针对JDK6编译的,所以不能直接使用这些类,并且必须将它构建为一个单独的模块,正如Joda所要求的那样.
我不介意启动这个项目,但是看看是否还有其他工作正在进行中.
通过JDBC 4.1或更早版本从数据库中检索java.sql.Timestamp时,如何获取/转换为java.time对象?
Postgres的开源JDBC驱动程序都没有兼容JDBC 4.2,所以我正在寻找一种方法来使用java.time和JDBC 4.1.
我正在尝试创建一种方法,该方法使用 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)
它的顺序不正确,就像我的对象在其构造函数中的顺序一样,这可能是原因吗?
有没有办法如何创建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 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,然后在检索时将它们转换为位置时区.我提出了以下后续问题