如何在Java中以字符串格式获取当前时间戳? “yyyy.MM.dd.HH.mm.ss”

Posted

技术标签:

【中文标题】如何在Java中以字符串格式获取当前时间戳? “yyyy.MM.dd.HH.mm.ss”【英文标题】:How to get current timestamp in string format in Java? "yyyy.MM.dd.HH.mm.ss" 【发布时间】:2014-05-28 22:04:15 【问题描述】:

如何在 Java 中获取字符串格式的时间戳? "yyyy.MM.dd.HH.mm.ss"

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Timestamp());

这是我的,但是 Timestamp() 需要一个参数...

【问题讨论】:

preparedStatement.setTimestamp(1, new Timestamp(System.currentTimeMillis())); 你遇到了什么错误? 仅供参考,非常麻烦的旧日期时间类,例如 SimpleDateFormatjava.sql.Timestamp 现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代。见Tutorial by Oracle。 【参考方案1】:

替换

new Timestamp();

new java.util.Date()

因为Timestamp没有默认构造函数,或者你可以用方法来做:

new Timestamp(System.currentTimeMillis());

【讨论】:

仅供参考,非常麻烦的旧日期时间类,例如 java.util.Datejava.sql.Timestamp 现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代。见Tutorial by Oracle。 我用过:new Date().getTime();【参考方案2】:

使用java.util.Date 类而不是时间戳。

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());

这将为您提供指定格式的当前日期。

【讨论】:

这帮助了我,我做了一些改变,所以我不必导入new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date()) 更好new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(new Date()); 这是一个非常有用的答案。谢谢。 SimpleDadeFormat 不是线程安全的,请确保您没有在多线程环境中使用它。一旦我忽略了这一点,当比较两个日期时,它会给出不可预测的结果。【参考方案3】:

tl;博士

只使用现代的 java.time 类。永远不要使用糟糕的遗留类,例如 SimpleDateFormatDatejava.sql.Timestamp

ZonedDateTime                    // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now(                            // Capture the current moment.
    ZoneId.of( "Africa/Tunis" )  // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST. 
)                                // Returns a `ZonedDateTime` object. 
.format(                         // Generate a `String` object containing text representing the value of our date-time object. 
    DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
)                                // Returns a `String`. 

或者使用JVM的当前默认时区。

ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )

java.time & JDBC 4.2

现代方法使用如上所示的 java.time 类。

如果您的JDBC driver 符合JDBC 4.2,您可以直接与数据库交换java.time 对象。使用PreparedStatement::setObjectResultSet::getObject

java.sql 仅用于 JDBC 4.2 之前的驱动程序

如果您的 JDBC 驱动程序尚不符合 JDBC 4.2 以支持 java.time 类型,则必须回退到使用 java.sql 类。

存储数据。

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;  // Capture the current moment in UTC.
myPreparedStatement.setObject( … , odt ) ;

检索数据。

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

java.sql 类型,例如java.sql.Timestamp,应该只用于传入和传出数据库。在 Java 8 及更高版本中立即转换为 java.time 类型。

java.time.Instant

java.sql.Timestamp 映射到java.time.Instant,即 UTC 时间线上的时刻。注意添加到旧类中的新转换方法toInstant

java.sql.Timestamp ts = myResultSet.getTimestamp( … );
Instant instant = ts.toInstant(); 

时区

应用所需/预期的时区 (ZoneId) 以获得 ZonedDateTime

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

格式化字符串

使用DateTimeFormatter 生成您的字符串。模式代码与java.text.SimpleDateFormat类似,但不完全一致,请仔细阅读文档。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );

这种特殊格式的确切含义不明确,因为它没有任何offset-from-UTC 或时区的指示。

ISO 8601

如果您对此事有任何发言权,我建议您考虑使用标准的ISO 8601 格式,而不是自己滚动。标准格式与您的非常相似。例如:2016-02-20T03:26:32+05:30

java.time 类默认使用这些标准格式,因此无需指定模式。 ZonedDateTime 类通过附加时区名称扩展了标准格式(一个明智的改进)。

String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]

转换成java.sql

您可以从 java.time 转换回 java.sql.Timestamp。从ZonedDateTime 中提取Instant

新方法已添加到旧类中,以方便与 java.time 类相互转换。

java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );


关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

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

您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

从哪里获取 java.time 类?

Java SE 8Java SE 9Java SE 10Java SE 11 和更高版本 - 包含捆绑实现的标准 Java API 的一部分。 Java 9 添加了一些小功能和修复。 Java SE 6Java SE 7 大部分 java.time 功能在ThreeTen-Backport 中向后移植到 Java 6 和 7。 Android java.time 类的 android 捆绑包实现的更高版本。 对于早期的 Android (ThreeTenABP 项目适应 ThreeTen-Backport(如上所述)。见How to use ThreeTenABP…

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuarter 和more。

【讨论】:

那么以“yyyy.MM.dd.HH.mm.ss”格式获取当前挂钟时间戳的正确方法是什么?没有明确指定我当地时区的硬编码字符串?这就是主题启动者所要求的,我在你的答案中找不到它...... @t7ko 我在 tl;dr 部分添加了一行示例代码,展示了如何明确询问 JVM 当前的默认时区。不带任何参数调用 `now()` 的效果相同,但不清楚您是否打算使用默认值,或者您是否对时区的关键问题无知或健忘。【参考方案4】:

您可以使用 java.util.Date 代替 Timestamp :

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());

【讨论】:

【参考方案5】:

如果您使用 java 8 或更高版本,请使用现代 java.time 类。

String s = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());

Basil Bourque 的回答非常好。但是太长了。很多人都没有耐心读下去。前 3 个答案太老了,可能会误导 Java 新手。所以我为新来的开发人员提供了这个简短而现代的答案。希望这个答案可以减少可怕的SimpleDateFormat 的使用。

【讨论】:

【参考方案6】:

更合适的方法是在构造函数中指定一个 Locale 区域作为参数。下面的示例使用美国语言环境区域。日期格式对区域设置敏感,并使用区域设置来定制与用户所在地区的习俗和惯例相关的信息Locale (Java Platform SE 7)

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss", Locale.US).format(new Date());

【讨论】:

没有“区域设置”之类的东西。我怀疑您混淆了Locale 和不相关的时区。 Locale 控制格式的文化规范和用于月/日名称的人类语言。时区调整日期时间表示以适合某些地区的wall-clock time。在这个问题的情况下,区域设置是无关紧要的,因为没有格式问题可以应用文化规范,也没有任何月份/日期的名称可以本地化为任何特定的人类语言。 @BasilBourque 感谢您的意见。我已将答案更新为更明确【参考方案7】:

您可以使用以下内容:

new java.sql.Timestamp(System.currentTimeMillis()).getTime()

结果:

1539594988651

【讨论】:

它没有要求的字符串格式。另外,我担心它添加到几个类似答案的唯一一件事就是不必要的复杂化......【参考方案8】:

我正在使用这个

String timeStamp = new SimpleDateFormat("dd/MM/yyyy_HH:mm:ss").format(Calendar.getInstance().getTime());
System.out.println(timeStamp);

【讨论】:

这是我实际上能够使用的唯一答案。我能够找到合适的进口!

以上是关于如何在Java中以字符串格式获取当前时间戳? “yyyy.MM.dd.HH.mm.ss”的主要内容,如果未能解决你的问题,请参考以下文章

java 如何获取当前时间的时间戳

如何在 laravel 中以编辑形式显示时间戳格式?

如何在 Java 中以 YYYY-MM-DD HH:MI:Sec.Millisecond 格式获取当前时间?

如何在 Kotlin 中获取当前时间作为时间戳?

以时间戳格式获取当前 NSDate

如何在 BigQuery 中以字符串格式将工作日月份转换为日期?