如何在Java中以字符串格式获取时间戳? “yyyy.MM.dd.HH.mm.ss”
String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Timestamp());
这就是我所拥有的,但 Timestamp() 需要一个参数......
SimpleDateFormat
和 java.sql.Timestamp
)现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代。见Tutorial by Oracle。
代替
new Timestamp();
和
new java.util.Date()
因为 Timestamp
没有默认构造函数,或者您可以使用以下方法:
new Timestamp(System.currentTimeMillis());
使用 java.util.Date
类而不是时间戳。
String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new java.util.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())
;
tl;博士
仅使用现代 java.time 类。切勿使用糟糕的遗留类,例如 SimpleDateFormat
、Date
或 java.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::setObject
和 ResultSet::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 ) ;
检索数据。
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() );
https://i.stack.imgur.com/bXtIS.png
关于 java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date
、Calendar
和 & SimpleDateFormat
。
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 8、Java SE 9、Java SE 10、Java SE 11 及更高版本 - 标准 Java API 的一部分,具有捆绑的实现。
Java 9 添加了一些小功能和修复。
Java SE 6 和 Java SE 7
大多数 java.time 功能在 ThreeTen-Backport 中向后移植到 Java 6 和 7。
安卓
java.time 类的更高版本的 Android 捆绑实现。
对于早期的 Android(<26),ThreeTenABP 项目采用了 ThreeTen-Backport(如上所述)。请参阅如何使用 ThreeTenABP……。
ThreeTen-Extra 项目使用其他类扩展 java.time。该项目是未来可能添加到 java.time 的试验场。您可能会在此处找到一些有用的类,例如 Interval
、YearWeek
、YearQuarter
和 more。
您可以使用 java.util.Date 而不是 Timestamp :
String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());
如果您使用 java 8 或更高版本,请使用现代 java.time
类。
String s = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
Basil Bourque 的回答非常好。但是太长了。很多人都没有耐心读下去。前 3 个答案太老了,可能会误导 Java 新手。所以我为新来的开发人员提供了这个简短而现代的答案。希望这个答案可以减少糟糕的SimpleDateFormat
的使用。
您可以使用以下内容:
new java.sql.Timestamp(System.currentTimeMillis()).getTime()
结果:
1539594988651
更合适的方法是在构造函数中指定一个 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。在这个问题的情况下,区域设置是无关紧要的,因为没有格式问题可以应用文化规范,也没有任何月份/日期的名称可以本地化为任何特定的人类语言。
我正在使用这个
String timeStamp = new SimpleDateFormat("dd/MM/yyyy_HH:mm:ss").format(Calendar.getInstance().getTime());
System.out.println(timeStamp);
如果你的日期就像 let mydate = "2022-15-06";
让 newDate = Date.now(mydate)
现在在 newDate 你有当前的时间戳
Date
类。
java.util.Date
和java.sql.Timestamp
)现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代。见Tutorial by Oracle。new Date().getTime();