我正在查看日期文档,尝试找出如何表达“现在时间 + 5秒”的方式。这是一些伪代码:
import java.util.Date
public class Main {
public static void main(String args[]) {
Date now = new Date();
now.setSeconds(now.getSeconds() + 5);
}
}
Date
/Calendar
类一样。例如:java.time.Instant.now().plusSeconds(5)
。 - Basil Bourque你可以使用:
now.setTime(now.getTime() + 5000);
Date.getTime()
和setTime()
始终是指自1970年1月1日UTC 12:00:00以来的毫秒数。
但是,如果您需要处理的日期/时间不仅仅是最简单的情况,我强烈建议您使用Joda Time。它是一个比Java内置支持库功能更加强大且易于使用的库。
DateTime later = DateTime.now().plusSeconds( 5 );
Joda-Time后来启发了新的内置于Java 8中的java.time包。
来自单行代码的hacky部分:
new Date(System.currentTimeMillis() + 5000L)
从您的示例中我了解到,'now'表示'现在',而"System.currentTimeMillis()"恰好表示相同的'now'概念 :-)
但是,是的,对于比这更复杂的任何事情,Joda时间API都非常出色。
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.
使用现代的java.time类,这些类多年前替代了可怕的Date
和Calendar
类。
要在UTC中工作,请使用Instant
。
Instant later = Instant.now().plusSeconds( 5 ) ;
要在特定的时区工作,请使用ZonedDateTime
。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime later = ZonedDateTime.now( z ).pluSeconds( 5 ) ;
持续时间
您可以使用Duration
类来软编码添加时间的数量和粒度。
Duration d = Duration.ofSeconds( 5 ) ;
Instant later = Instant.now().plus( d ) ; // Soft-code the amount of time to add or subtract.
java.time框架内置于Java 8及以上版本。这些类取代了老旧的legacy日期时间类,例如java.util.Date
、Calendar
和SimpleDateFormat
。
要了解更多信息,请参阅Oracle教程。在Stack Overflow上搜索许多示例和解释。规范是JSR 310。
Joda-Time项目现在处于维护模式,建议迁移到java.time类。
您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。无需字符串,无需java.sql.*
类。Hibernate 5和JPA 2.2支持java.time。
如何获取java.time类?
正如其他人所指出的,在Joda中,这更容易实现:
DateTime dt = new DateTime();
DateTime added = dt.plusSeconds(5);
我强烈建议您迁移到Joda。几乎所有关于Java日期的问题都会得出Joda推荐 :-) Joda API应该是新标准Java日期API(JSR310)的基础,因此您将会朝着一个新的标准迁移。
忽略Dates
,专注于问题。
我的偏好是使用java.util.concurrent.TimeUnit
,因为它可以让我的代码更加清晰易懂。
在Java中,
long now = System.currentTimeMillis();
TimeUtil
从now
开始计算5秒后的时间是:long nowPlus5Seconds = now + TimeUnit.SECONDS.toMillis(5);
参考资料: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/TimeUnit.html
这里提供了一个有用的链接,可以帮助你更好地理解Java中的时间单位。更新:请查看使用java.time类的我的新答案。我将保留此答案作为历史记录。
Pascal Thivent的答案和Jon Skeet的答案都是正确且好的。这里有一些额外的信息。
PT5S
(ISO 8601)另一种表达“五秒钟之后”的方式是使用ISO 8601定义的标准格式字符串。持续时间/周期格式具有以下模式:PnYnMnDTnHnMnS
,其中P
标记开始,T
将日期部分与时间部分分开。
因此,五秒钟为PT5S
。
Joda-Time 2.8库可以生成和解析这种持续时间/周期字符串。请参阅Period
、Duration
和Interval
类。您可以将Period对象加减到DateTime
对象中。
在StackOverflow上搜索许多示例和讨论。这里是一个快速的示例。
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zone );
DateTime then = now.plusSeconds( 5 );
Interval interval = new Interval( now, then );
Period period = interval.toPeriod( );
DateTime thenAgain = now.plus( period );
转储到控制台。
System.out.println( "zone: " + zone );
System.out.println( "From now: " + now + " to then: " + then );
System.out.println( "interval: " + interval );
System.out.println( "period: " + period );
System.out.println( "thenAgain: " + thenAgain );
运行时。
zone: America/Montreal
From now: 2015-06-15T19:38:21.242-04:00 to then: 2015-06-15T19:38:26.242-04:00
interval: 2015-06-15T19:38:21.242-04:00/2015-06-15T19:38:26.242-04:00
period: PT5S
thenAgain: 2015-06-15T19:38:26.242-04:00
我刚从Java文档中找到了这个。
import java.util.Calendar;
public class Main {
public static void main(String[] args) {
Calendar now = Calendar.getInstance();
System.out.println("Current time : " + now.get(Calendar.HOUR_OF_DAY) + ":"
+ now.get(Calendar.MINUTE) + ":" + now.get(Calendar.SECOND));
now.add(Calendar.SECOND, 100);
System.out.println("New time after adding 100 seconds : " + now.get(Calendar.HOUR_OF_DAY) + ":"
+ now.get(Calendar.MINUTE) + ":" + now.get(Calendar.SECOND));
}
}
我需要了解一下相关惯例吗?
String serverTimeSync = serverTimeFile.toString();
SimpleDateFormat serverTime = new SimpleDateFormat("yyyy,MM,dd,HH,mm,ss");
Calendar c = Calendar.getInstance();
c.setTime(serverTime.parse(serverTimeSync));
c.add(Calendar.MILLISECOND, 15000);
serverTimeSync = serverTime.format(c.getTime());
试试这个...
Date now = new Date();
System.out.println(now);
Calendar c = Calendar.getInstance();
c.setTime(now);
c.add(Calendar.SECOND, 5);
now = c.getTime();
System.out.println(now);
// Output
Tue Jun 11 16:46:43 BDT 2019
Tue Jun 11 16:46:48 BDT 2019
Calendar
和Date
已经被几乎完全弃用。现在,回答这个问题的方法就像是 LocalDateTime result = LocalDateTime.now().plusSeconds(5);
一样简单。(其中“简单”带有通常的免责声明:“……除非你在这5秒钟内经历了某些奇怪的时区变化,等等……”) - Marco13LocalDateTime
来跟踪特定时刻,正如它在Javadoc中所解释的那样。对于一个瞬间,请使用 ZonedDateTime
、OffsetDateTime
或 Instant
。例如:ZonedDateTime.now( ZoneId.systemDefault() ).plusSeconds( 5 )
。 - Basil Bourque
Date
。它是Java 1.0中设计不良的类,并在十年前被java.time,现代Java日期和时间API所取代。 - undefined