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
方法实例化一个新的新对象

日志框架 尽管这样做很好