如何在Java中获取当前日期/时间
如何在Java中获取当前日期/时间
在Java中获取当前日期/时间有多种方法。以下是一些常用的方法:
方法1:使用SimpleDateFormat类
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Date date = new Date(); System.out.println(dateFormat.format(date));
方法2:使用Calendar类
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Calendar cal = Calendar.getInstance(); System.out.println(dateFormat.format(cal.getTime()));
方法3:使用单行代码
System.out.println(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date()));
请注意,过时的旧日期/时间类(如`java.util.Date`、`java.util.Calendar`和`java.text.SimpleDateFormat`)已经被Java 8及更高版本中内置的`java.time`类所取代。你可以查看Oracle的教程了解更多信息。
对于需要忽略夏令时的情况,你可以使用`ZonedDateTime.now(ZoneId.of("America/Sao_Paulo"))`方法来获取巴西的当前时间。这将返回正确的时间,不会受到夏令时的影响。
以上是获取当前日期/时间的常用方法。你可以根据自己的需求选择适合的方法来获取当前日期/时间。
如何在Java中获取当前日期/时间
在Java中获取当前日期/时间是一个常见的需求。下面是一些解决方法:
如果你只需要以YYYY.MM.DD-HH.MM.SS的格式输出时间戳(非常常见的情况),以下是一个简单的方法:
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());
使用静态的final DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")可能会在运行时略微更快。
需要注意的是,SimpleDateFormat这个类已经过时,并且有着非常糟糕的并发问题。如果你使用的是Java 8及以上版本,建议使用Java 8的日期时间类库,可以参考Java 8的官方文档。
需要注意的是,旧的日期/时间类(如java.util.Date,java.util.Calendar和java.text.SimpleDateFormat)已经被认为是遗留类,被Java 8及以上版本中的java.time类库所取代。可以参考Oracle的官方教程。
在代码示例中,描述中使用了点和破折号,但代码中只使用了下划线,而且没有使用日期/时间的分隔符。
这也是为什么应该将应用程序更新到Java 8或更高版本的另一个原因。但如果无法更新,你可以考虑使用Joda Time类库来替代旧的日期/时间类。
最后,希望以上内容对你有所帮助。
如何在Java中获取当前日期/时间?
没有“最佳”方法。
这取决于你想要的日期/时间形式:
- 如果你想要将日期/时间作为单个数字值,那么System.currentTimeMillis()
会给出以毫秒为单位的UNIX纪元后的数字值(作为Java的long
类型)。该值是相对于UTC时间点的增量,并且独立于本地时区1。
- 如果你想以允许你以数字方式访问组成部分(年、月等)的形式获取日期/时间,你可以使用以下方法之一:
- new Date()
会给出一个以当前日期/时间初始化的Date
对象。问题是Date
的API方法大多已经弃用并且存在缺陷。
- Calendar.getInstance()
会给出一个以默认Locale
和TimeZone
初始化的Calendar
对象。其他重载允许你使用特定的Locale
和/或TimeZone
。Calendar可以工作,但API仍然很繁琐。
- new org.joda.time.DateTime()
会给出一个使用默认时区和年代的Joda-time对象。还有很多其他的Joda替代方案,这里无法一一描述。(但请注意,一些人报告称Joda时间存在性能问题,例如https://stackoverflow.com/questions/6280829.)
- 在Java 8中,调用java.time.LocalDateTime.now()
和java.time.ZonedDateTime.now()
将会给出当前日期/时间的表示2。
- 在Java 8之前,大多数了解这些内容的人都推荐Joda-time作为在涉及时间点和持续时间计算方面具有最佳Java API的选择。
在Java 8及之后,推荐使用标准的java.time
包。Joda时间现在被认为是“过时的”,Joda的维护者建议人们进行迁移3。
1 - System.currentTimeMillis()
给出的是“系统”时间。尽管将系统时钟设置为(名义上的)UTC是正常操作,但本地UTC时钟与真正的UTC之间会有一个差异(增量)。增量的大小取决于系统时钟与UTC的同步程度和频率。
2 - 请注意,LocalDateTime不包含时区。正如javadoc所说:“如果没有附加的偏移量或时区等其他信息,它无法表示时间线上的一个瞬间。”
3 - 注意:如果不进行迁移,你的Java 8代码不会出错,但Joda代码库可能最终停止获得错误修复和其他补丁。截至2020年2月,尚未宣布Joda的官方“寿命终结”,并且Joda的API未标记为已弃用。
“这个值是相对于UTC时间点的增量,并且独立于本地时区”是什么意思?
我不明白“相对于UTC时间点的增量,并且独立于本地时区”这部分的含义。
- System.currentTimeMillis()
的值大致上是UTC,并且本地UTC时钟与真正的UTC之间可能存在差异(增量)。System.currentTimeMillis()
独立于本地时区...因为它是UTC,而无论计算机、用户或其他任何事物的本地时区如何,UTC始终是相同的。
谢谢你的跟进。这下明白了。但我不明白你所说的本地UTC时钟是什么意思?UTC就是UTC。它怎么会对本地和真正的UTC有所不同?
- 1)我指的是计算机上生成currentTimeMillis()
返回值的物理/虚拟设备。2)我所说的“本地UTC”就是currentTimeMillis()
返回的值...它与真正的UTC不同。它们不同的原因是显而易见的。大多数人无法将他们的系统时钟与UTC进行精确到毫秒级别的同步。
很好的回答。我唯一的改进是明确指定传递给Joda-Time和java.time方法的时区,而不是隐式依赖于JVM的当前默认时区。这种依赖往往会引起许多混乱。
- 引用javadoc:“使用这种方法将阻止使用备用时间源进行测试,因为时钟实际上是硬编码的。”但如果你不关心这个,这是一个可选项。