Java时间戳 - 如何创建日期为23/09/2007的时间戳?

时间:2009-06-10 11:15:00

标签: java datetime timestamp date

如何创建日期为23/09/2007的时间戳?

8 个答案:

答案 0 :(得分:141)

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);

答案 1 :(得分:107)

这个怎么样?

java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");

答案 2 :(得分:17)

你的意思是什么时间戳?如果你的意思是自Unix时代以来的毫秒:

GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();

如果你想要一个实际的java.sql.Timestamp对象:

Timestamp ts = new Timestamp(millis);

答案 3 :(得分:10)

TL;博士

java.sql.Timestamp.from (
    LocalDate.of ( 2007 , 9 , 23 )
             .asStartOfDay( ZoneId.of ( "America/Montreal" ) )
             .toInstant()
)

java.time

让我们通过使用Java 8及更高版本中内置的java.time框架显示代码来更新此页面。

这些新类的灵感来自Joda-Time,由JSR 310定义,并由ThreeTen-Extra项目扩展。他们取代了早期版本的Java捆绑的臭名昭着的旧日期时间类。

在java.time中,Instant是UTC时间轴上的一个时刻。 ZonedDateTime是即时调整为时区(ZoneId)。

时区在这里至关重要。如果不应用时区,则September 23, 2007的日期无法转换为时间轴上的某个时刻。考虑到巴黎早些时候新的一天比在蒙特利尔还要“新的一天”还要“昨天”。

此外,java.sql.Timestamp表示日期和时间。因此,我们必须注入一个时间来与日期一起。我们假设您希望将当天的第一时刻作为时间。请注意,由于夏令时和可能的其他异常,这并不总是时间00:00:00.0

请注意,与旧的java.util.Date类不同,与Joda-Time不同,java.time类型的分辨率为纳秒而不是毫秒。这与java.sql.Timestamp。

的分辨率相匹配

请注意,java.sql.Timestamp有一个讨厌的习惯,即在通过toString方法生成字符串表示时,将JVM的当前默认时区隐式应用于其日期时间值。在这里,您可以看到我的America/Los_Angeles时区已应用。相比之下,使用标准ISO 8601格式,java.time类更加清晰。

LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ;
ZoneId z = ZoneId.of ( "America/Montreal" ) ;
ZonedDateTime zdt = d.asStartOfDay( 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 [America / Montreal] = 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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 4 :(得分:4)

根据API,将接受年,月等的构造函数已弃用。相反,你应该使用接受long的构造函数。 您可以使用Calendar实现来构建所需的日期,并将时间表示作为long来访问,例如使用getTimeInMillis方法。

答案 5 :(得分:4)

您还可以执行以下操作:

// 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());

答案 6 :(得分:1)

为了完整起见,还提供了Joda-Time版本2.5及其DateTime类的解决方案:

new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())

答案 7 :(得分:-1)

更一般的答案是导入java.util.Date,然后当您需要将timestamp设置为等于当前日期时,只需将其设置为new Date()