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

use*_*884 152 java datetime timestamp date

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

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Timestamp());
Run Code Online (Sandbox Code Playgroud)

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

Jig*_*shi 189

更换

new Timestamp();
Run Code Online (Sandbox Code Playgroud)

new java.util.Date()
Run Code Online (Sandbox Code Playgroud)

因为没有默认构造函数Timestamp,或者您可以使用以下方法执行此操作:

new Timestamp(System.currentTimeMillis());
Run Code Online (Sandbox Code Playgroud)

  • 在Java 8中更好:http://docs.oracle.com/javase/tutorial/datetime/ (12认同)
  • 仅供参考,非常麻烦的旧日期时间类,例如 [`java.util.Date`](https://docs.oracle.com/javase/10/docs/api/java/util/Date.html) 和 ` java.sql.Timestamp` 现在是 [legacy](https://en.wikipedia.org/wiki/Legacy_system),被 [*java.time*](https://docs.oracle.com/javase/ 10/docs/api/java/time/package-summary.html) 内置于 Java 8 及更高版本中的类。请参阅 [*教程* by Oracle](https://docs.oracle.com/javase/tutorial/datetime/TOC.html)。 (11认同)

dim*_*niy 143

使用java.util.Dateclass而不是Timestamp.

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());
Run Code Online (Sandbox Code Playgroud)

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

  • 这帮助了我,我做了一些改动,所以我不必导入`new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date()) ` (5认同)
  • SimpleDadeFormat 不是线程安全的,请确保您没有在多线程环境中使用它。有一次我忽略了这一点,当比较两个日期时,它会给出不可预测的结果。 (4认同)

Kak*_*rot 30

您可以使用java.util.Date而不是Timestamp:

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 28

TL;博士

仅使用现代java.time类.切勿使用可怕的遗产类,如SimpleDateFormat,Datejava.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`. 
Run Code Online (Sandbox Code Playgroud)

java.time和JDBC 4.2

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

如果JDBC驱动程序符合JDBC 4.2,则可以直接与数据库交换java.time对象.使用PreparedStatement::setObjectResultSet::getObject.

在JDBC 4.2之前仅对驱动程序使用java.sql

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

存储数据.

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

检索数据.

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Run Code Online (Sandbox Code Playgroud)

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

java.time.Instant

一个java.sql.Timestamp映射到java.time.Instant,在UTC时间线上的时刻.

java.sql.Timestamp ts = myResultSet.getTimestamp( … );
Instant instant = ts.toInstant(); 
Run Code Online (Sandbox Code Playgroud)

时区

应用所需/预期的时区来获得ZonedDateTime.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Run Code Online (Sandbox Code Playgroud)

格式化字符串

使用a DateTimeFormatter生成字符串.模式代码类似于java.text.SimpleDateFormat但不完全相同,因此请仔细阅读文档.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );
Run Code Online (Sandbox Code Playgroud)

这种特殊格式的确切含义含糊不清,因为它没有任何偏离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]
Run Code Online (Sandbox Code Playgroud)

转换为java.sql

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

旧类中添加了新方法,以便于转换为java.time类或从java.time类转换.

java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );
Run Code Online (Sandbox Code Playgroud)

关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和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的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.

  • 那么以“yyyy.MM.dd.HH.mm.ss”格式获取当前挂钟时间戳的正确方法是什么?没有明确指定我的本地时区的硬编码字符串?这就是主题发起者问的问题,我在你的答案中找不到它...... (3认同)

gzc*_*gzc 13

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

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

Basil Bourque的回答非常好。但是时间太长了。许多人没有耐心阅读它。前 3 个答案太旧了,可能会误导 Java new bee。所以我为新来的开发人员提供了这个简短而现代的答案。希望这个答案可以减少可怕的SimpleDateFormat.


Pho*_*nix 10

您可以使用以下内容:

new java.sql.Timestamp(System.currentTimeMillis()).getTime()
Run Code Online (Sandbox Code Playgroud)

结果:

1539594988651
Run Code Online (Sandbox Code Playgroud)


use*_*836 6

更合适的方法是将Locale区域指定为构造函数中的参数.以下示例使用美国区域设置区域.日期格式设置是区域设置敏感的,并使用Locale来定制与用户区域Locale(Java Platform SE 7)的习惯和惯例相关的信息.

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

  • 没有“区域设置区域”这样的东西。我怀疑您混淆了不相关的“区域设置”和时区。“Locale”控制格式化的文化规范以及用于月/日名称的人类语言。时区调整日期时间表示以适合某些地区的[挂钟时间](https://en.wikipedia.org/wiki/Wall_clock_time)。就这个问题而言,区域设置是无关紧要的,因为不存在应用文化规范的格式问题,也没有任何月/日名称可本地化为任何特定的人类语言。 (2认同)