从现在开始,我如何说Java?

Nic*_*tes 59 java date

我正在查看日期文档,并试图找出我如何表达NOW + 5秒.这是一些伪代码:

import java.util.Date
public class Main {

    public static void main(String args[]) {
         Date now = new Date();
         now.setSeconds(now.getSeconds() + 5);
    }
}
Run Code Online (Sandbox Code Playgroud)

Pas*_*ent 81

日期几乎完全弃用,并且由于向后兼容性原因仍然存在.如果您需要设置特定日期或进行日期算术,请使用日历:

Calendar calendar = Calendar.getInstance(); // gets a calendar using the default time zone and locale.
calendar.add(Calendar.SECOND, 5);
System.out.println(calendar.getTime());
Run Code Online (Sandbox Code Playgroud)

  • @Karl,作为此示例中的FYI calendar.getTime()返回Date.我认为他们不会弃用Date,因为他们不赞成使用它的一些功能. (10认同)
  • 很少,很少被弃用的东西真正从JRE中删除,通常只有在功能有害的情况下才会这样做.我认为在接下来的几个主要版本中都不会删除Date.它被弃用了,因为它有一些严重的缺点,但它会保持不变. (5认同)
  • @Tuntable [*Joda-Time*](https://www.joda.org/joda-time/) 项目由 [JSR 310](https://www.joda-time/) 中定义的 *java.time* 类继承。 jcp.org/en/jsr/detail?id=310),以及可怕的“日期”/“日历”类。例如:`java.time.Instant.now().plusSeconds( 5 )` (3认同)

Jon*_*eet 52

您可以使用:

now.setTime(now.getTime() + 5000);
Run Code Online (Sandbox Code Playgroud)

Date.getTime()并且setTime()总是指自1970年1月1日上午12点UTC以来的毫秒数.

乔达时间

但是,如果你做的不仅仅是最简单的日期/时间处理,我强烈建议你使用Joda Time.这是一个很多更强大和友好的库比在Java中内置支持.

DateTime later = DateTime.now().plusSeconds( 5 );
Run Code Online (Sandbox Code Playgroud)

java.time

Joda-Time后来启发了Java 8中内置的新java.time包.

  • 好吧,我不能让java.util.Date问题没有提到Joda :) (6认同)
  • 当我按F5时,你的帖子会填充越来越多有用的信息,这很神奇= / (4认同)

小智 23

从单线 - hacky dep.:

new Date( System.currentTimeMillis() + 5000L)

正如我从你的例子中所理解的那样,'now'实际上是'现在',并且"System.currentTimeMillis()'碰巧代表了同样的'现在'概念:-)

但是,是的,对于比Joda时间API更复杂的一切.


Bas*_*que 14

tl;博士

Instant             // Use modern `java.time.Instant` class to represent a moment in UTC.
.now()              // Capture the current moment in UTC.
.plusSeconds( 5 )   // Add five seconds into the future. Returns another `Instant` object per the Immutable Objects pattern.
Run Code Online (Sandbox Code Playgroud)

时间

使用多年前取代了可怕的&类的现代java.time类。DateCalendar

世界标准时间

要在 UTC 中工作,请使用Instant.

Instant later = Instant.now().plusSeconds( 5 ) ;
Run Code Online (Sandbox Code Playgroud)

时区

要在特定时区工作,请使用ZonedDateTime.

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime later = ZonedDateTime.now( z ).pluSeconds( 5 ) ;
Run Code Online (Sandbox Code Playgroud)

Duration

您可以对要添加的时间量和粒度进行软编码。使用Duration类。

Duration d = Duration.ofSeconds( 5 ) ;
Instant later = Instant.now().plus( d ) ;  // Soft-code the amount of time to add or subtract.
Run Code Online (Sandbox Code Playgroud)

关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310

现在处于维护模式Joda-Time项目建议迁移到java.time类。

您可以直接与您的数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC 驱动程序。不需要字符串,不需要类。Hibernate 5 & JPA 2.2 支持java.timejava.sql.*

从哪里获得 java.time 类?


Bri*_*new 6

正如其他人所指出的,在Joda中它更容易:

DateTime dt = new DateTime();
DateTime added = dt.plusSeconds(5);
Run Code Online (Sandbox Code Playgroud)

我强烈建议你迁移到Joda.几乎所有关于SO的Java日期相关问题都解决了Joda建议:-) Joda API应该是新标准Java date API(JSR310)的基础,因此您将迁移到新标准.

  • "java.util.Date"是"使用Joda Time"作为"随机给我重复的值"是"不要继续创建随机的新实例":) (5认同)

Ale*_*tos 5

忽视Dates并专注于这个问题.

我的偏好是使用,java.util.concurrent.TimeUnit因为它增加了我的代码的清晰度.

在Java中

long now = System.currentTimeMillis();
Run Code Online (Sandbox Code Playgroud)

从5秒now使用TimeUtil为:

long nowPlus5Seconds = now + TimeUnit.SECONDS.toMillis(5);
Run Code Online (Sandbox Code Playgroud)

参考:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/TimeUnit.html