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


174

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

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

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


prepareStatement.setTimestamp(1,new Timestamp(System.currentTimeMillis()));
拉贾特

你遇到了什么错误?
罗伯特·哥伦比亚

仅供参考,非常麻烦的旧日期时间类(例如SimpleDateFormatjava.sql.Timestamp现在已成为旧版),由Java 8和更高版本中内置的java.time类取代。请参见Oracle 教程
罗勒·布尔克

Answers:



160

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

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

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


5
这帮助了我,我进行了一些更改,因此不必导入 new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date())
Pini Cheyni 2015年

更好new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(new Date());
Zon

36

tl; dr

仅使用现代的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驱动程序符合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 );

这种特定格式在其确切含义上是模棱两可的,因为它没有任何偏离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.TimestampInstant从中提取ZonedDateTime

新的方法已添加到旧类中,以促进与java.time类之间的相互转换。

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

Java(旧式和现代)和标准SQL中的日期时间类型表


关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar,和SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

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

在哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多


那么,以“ yyyy.MM.dd.HH.mm.ss”格式获取当前挂钟时间戳的正确方法是什么?没有明确指定本地时区的硬编码字符串?那是主题入门者问的,我在您的答案中找不到...
t7ko

@ t7ko我在tl; dr部分添加了示例代码行,显示了如何显式询问JVM的当前默认时区。不带任何参数调用'now()'的作用相同,但不清楚是要使用默认值还是对时区这一关键问题不了解或遗忘。
罗勒·布尔克

32

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

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

6

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

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

1
没有“语言环境区域”之类的东西。我怀疑您的困惑Locale和时区无关。Locale控制格式的文化规范和用于月份/日期名称的人类语言。时区将日期时间表示调整为适合某个区域的壁钟时间。在此问题中,语言环境是无关紧要的,因为没有格式问题可以应用文化规范,也没有任何月份/日期名称可以本地化为任何特定的人类语言。
罗勒·布尔克

@BasilBourque谢谢您的输入。我已经更新了答案,使答案更明确了
user3144836 '16

4

您可以使用以下内容

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

Result : 1539594988651

希望这会有所帮助。只是我的建议,而不是奖励积分。


它没有要求的字符串格式。同样,我担心它只会增加不必要的复杂性……
Ole VV

4

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

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

罗勒·布尔克(Basil Bourque)的回答非常好。但这太长了。许多人没有耐心阅读它。前3个答案太旧,可能会误导Java新手。因此,我为新开发者提供了这个简短而现代的答案。希望这个答案可以减少可怕的使用SimpleDateFormat

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.