Java 调用date()的实例不更新时间
在将一些带有时间戳的消息记录到控制台进行调试时,我注意到时间戳在打印时没有被更新。即使消息以随机间隔相隔几秒,也会显示准确时间。如何获取当前的准确时间 使用的代码(来自): 试试这个:Java 调用date()的实例不更新时间,java,date,datetime,Java,Date,Datetime,在将一些带有时间戳的消息记录到控制台进行调试时,我注意到时间戳在打印时没有被更新。即使消息以随机间隔相隔几秒,也会显示准确时间。如何获取当前的准确时间 使用的代码(来自): 试试这个: public class Debug { public void log(String msg) { String time = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date()); System
public class Debug {
public void log(String msg) {
String time = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());
System.out.println(time + " : " + msg);
}
}
为什么会这样?
对于您的代码,time
仅在创建Debug
的新实例时更新。相反,您希望它在调用log()
时得到更新。因此,请在此处更新它。尝试以下操作:
public class Debug {
public void log(String msg) {
String time = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());
System.out.println(time + " : " + msg);
}
}
为什么会这样?
对于您的代码,time
仅在创建Debug
的新实例时更新。相反,您希望它在调用log()
时得到更新。所以,在那里更新它。java.time
答案是正确的。正在保留而不是重新生成日期实例。但是问题和答案都使用了过时的类
旧的麻烦的java.util.Date/.Calendar类已经被Java8和更高版本中的框架所取代。由JSR 310定义,灵感来自Joda Time
ZonedDateTime zdt = ZonedDateTime.now();
上面这一行隐式地分配JVM的当前默认时区。我强烈建议您始终明确指定所需/预期的时区
ZoneId zoneId = ZoneId.of( "Europe/Paris" );
ZonedDateTime zdt = ZonedDateTime.now( zoneId );
一串
您可以轻松获得日期时间值的文本表示形式
String output = zdt.toString();
2016-01-29T10:15:30+01:00[欧洲/巴黎]
默认情况下,该方法使用标准定义的合理格式生成字符串。实际上,该格式通过在括号中添加时区名称扩展了ISO 8601标准
您可以使用java.time.format包创建其他格式的字符串
UTC
业务逻辑、数据存储/交换、序列化和日志记录的一般最佳实践是使用,而不是任何
Instant
仅出于UTC的目的,调用简单的Instant
类,该类表示UTC时间线上的某个时刻。由于它总是使用UTC,您不需要通过时区,这与您在上面看到的zoneDateTime
不同
Instant instant = Instant.now();
String output = instant.toString().
Instant
上的toString
方法也使用ISO 8601。它的秒分数根据需要使用0、3、6或9位数字来表示毫秒、微秒或纳秒的分数。目前在Java 8 Update 72中,使用的时钟实现。现在
只会生成最长为毫秒的值
2016-12-03T10:15:30Z
不变对象
time框架使用。我们不改变java.time对象成员的值,而是主要基于旧对象的值创建一个新实例,除了我们需要的特定替代值
java.time对象,例如Instant
或ZonedDateTime
不会更改其成员值。对象不会自动更新到当前时刻。每次想要捕捉当前时刻时,调用now
方法实例化一个新的新对象
日志框架
虽然在刚开始的时候可以自己进行日志记录,但我建议您最终学会使用日志façade框架。作为一个幌子,您可以在整个代码库中散布SLF4J调用。但是,在运行时,这些调用会转到实际的日志实现中。如果刚开始,使用。LogBack由与SLF4J相同的人创建,无需通过适配器即可直接调用
如果一个项目已经在使用一个旧的Java日志框架,那么适配器可以转换SLF4J调用。这就是SLF4J的要点:避免被锁定在任何一个实现中。java.time
答案是正确的。正在保留而不是重新生成日期实例。但是问题和答案都使用了过时的类
旧的麻烦的java.util.Date/.Calendar类已经被Java8和更高版本中的框架所取代。由JSR 310定义,灵感来自Joda Time
ZonedDateTime zdt = ZonedDateTime.now();
上面这一行隐式地分配JVM的当前默认时区。我强烈建议您始终明确指定所需/预期的时区
ZoneId zoneId = ZoneId.of( "Europe/Paris" );
ZonedDateTime zdt = ZonedDateTime.now( zoneId );
一串
您可以轻松获得日期时间值的文本表示形式
String output = zdt.toString();
2016-01-29T10:15:30+01:00[欧洲/巴黎]
默认情况下,该方法使用标准定义的合理格式生成字符串。实际上,该格式通过在括号中添加时区名称扩展了ISO 8601标准
您可以使用java.time.format包创建其他格式的字符串
UTC
业务逻辑、数据存储/交换、序列化和日志记录的一般最佳实践是使用,而不是任何
Instant
仅出于UTC的目的,调用简单的Instant
类,该类表示UTC时间线上的某个时刻。由于它总是使用UTC,您不需要通过时区,这与您在上面看到的zoneDateTime
不同
Instant instant = Instant.now();
String output = instant.toString().
Instant
上的toString
方法也使用ISO 8601。它的秒分数根据需要使用0、3、6或9位数字来表示毫秒、微秒或纳秒的分数。目前在Java 8 Update 72中,使用的时钟实现。现在
只会生成最长为毫秒的值
2016-12-03T10:15:30Z
不变对象
time框架使用。我们不改变java.time对象成员的值,而是主要基于旧对象的值创建一个新实例,除了我们需要的特定替代值
java.time对象,例如Instant
或ZonedDateTime
不会更改其成员值。对象不会自动更新到当前时刻。每次想要捕捉当前时刻时,调用now
方法实例化一个新的新对象
日志框架
尽管这样做很好