我该如何创建一个带有日期 23/09/2007 的时间戳?
通过 Timestamp
,我认为你是指 java.sql.Timestamp
。 你会注意到这个类有一个接受 long
参数的构造函数。 你可以使用 DateFormat
类来解析它:
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("23/09/2007");
long time = date.getTime();
new Timestamp(time);
java.util.Date
、java.util.Calendar
和java.text.SimpleDateFormat
这样的旧日期时间类现在已经成为遗留系统,被内置于Java 8及更高版本中的java.time类所取代。请参阅Oracle的教程。 - Basil Bourquejava.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
你所说的时间戳是指什么?如果你指的是自Unix纪元以来的毫秒数:
GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();
如果您想要一个实际的java.sql.Timestamp对象:
Timestamp ts = new Timestamp(millis);
Calendar.SEPTEMBER
- Guillaume Hustajava.sql.Timestamp.from (
LocalDate.of ( 2007 , 9 , 23 )
.atStartOfDay( ZoneId.of ( "America/Montreal" ) )
.toInstant()
)
Instant
是 UTC 时间线上的一个时刻。而 ZonedDateTime
是调整为某个时区(ZoneId
)的 Instant。2007年9月23日
这一日期无法转换为时间线上的时刻。请考虑巴黎的新一天比蒙特利尔早,“昨天”仍未结束。00:00:00.0
。toString
方法生成字符串表示形式时,隐式应用您JVM的当前默认时区到其日期时间值。在这里,您可以看到我的America/Los_Angeles
时区应用。相比之下,java.time类更加明智,使用标准ISO 8601格式。LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ;
ZoneId z = ZoneId.of ( "America/Montreal" ) ;
ZonedDateTime zdt = d.atStartOfDay( z ) ;
Instant instant = zdt.toInstant() ;
java.sql.Timestamp ts = java.sql.Timestamp.from ( instant ) ;
转储到控制台。
System.out.println ( "d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts );
当运行时。
d: 2007-09-23 = zdt: 2007-09-23T00:00-04:00 [美国/蒙特利尔] = instant: 2007-09-23T04:00:00Z = ts: 2007-09-22 21:00:00.0
顺便提一下,从JDBC 4.2开始,您可以直接使用java.time类型。不需要使用java.sql.Timestamp
。
PreparedStatement.setObject
ResultSet.getObject
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 类?
Interval
,YearWeek
,YearQuarter
和更多。// untested
Calendar cal = GregorianCalendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 23);// I might have the wrong Calendar constant...
cal.set(Calendar.MONTH, 8);// -1 as month is zero-based
cal.set(Calendar.YEAR, 2009);
Timestamp tstamp = new Timestamp(cal.getTimeInMillis());
DateTime
对象。这意味着您的结果会因不同计算机或主机操作系统或JVM设置的配置而异。为了获得可预测的结果,请向该DateTime
构造函数传递一个时区。选择适当的时区名称以符合您的意图。例如,DateTimeZone.forID("America/Montreal")
或DateTimeZone.UTC
。 - Basil BourqueDateTime
对象询问其自纪元以来的毫秒数即可。用.getMillis()
替换.toDate().getTime()
。 - Basil BourqueDateTimeZone.getDefault()
并将结果作为可选参数传递来明确说明。 (顺便说一句,对于Locale.getDefault()
也是如此,可选参数的歧义问题相同。) - Basil Bourquejava.util.Date
,然后当你需要将timestamp
设置为当前日期时,只需将其设置为new Date()
。
java.sql.Timestamp
是现在已经遗留,许多年前被现代的 java.time 类所取代,这些类是在 JSR 310 中定义的。 - Basil Bourque