Java时间戳-如何创建日期为2007年9月23日的时间戳?

Java时间戳-如何创建日期为2007年9月23日的时间戳?,java,datetime,timestamp,date,Java,Datetime,Timestamp,Date,如何创建日期为2007年9月23日的时间戳 我想你指的是时间戳。您会注意到,这个类有一个接受long参数的构造函数。您可以使用DateFormat类来解析此内容: DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); Date date = dateFormat.parse("23/09/2007"); long time = date.getTime(); new Timestamp(time); 根据建议,不推荐使用接受年、

如何创建日期为2007年9月23日的时间戳

我想你指的是时间戳。您会注意到,这个类有一个接受
long
参数的构造函数。您可以使用
DateFormat
类来解析此内容:

DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("23/09/2007");
long time = date.getTime();
new Timestamp(time);
根据建议,不推荐使用接受年、月等的构造函数。相反,您应该使用接受长字符串的构造函数。
您可以使用一个实现来构造所需的日期,并以long形式访问时间表示,例如使用该方法。

时间戳是什么意思?如果您是指自Unix纪元起的毫秒数:

GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();
如果需要实际的java.sql.Timestamp对象:

Timestamp ts = new Timestamp(millis);
这个怎么样

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

您还可以执行以下操作:

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

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

为完整性起见,这也是版本2.5及其类的解决方案:

tl;博士 java.time 让我们通过显示使用内置于Java8和更高版本中的框架的代码来更新此页面

这些新类受项目的启发、定义和扩展。它们取代了与Java早期版本捆绑在一起的臭名昭著的旧日期时间类

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

时区在这里至关重要。如果不应用时区,2007年9月23日的日期不能转换为时间线上的某个时刻。想想新的一天在巴黎的时间早于蒙特利尔,现在仍然是“昨天”。 另外,java.sql.Timestamp同时表示日期和时间。因此,我们必须在一天中的某个时间与日期同步。我们假设您希望一天中的第一个时刻作为一天中的时间。请注意,由于夏令时和其他可能的异常情况,这并不总是时间
00:00:00.0

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

请注意,java.sql.Timestamp有一个坏习惯,即在通过其
toString
方法生成字符串表示时,隐式地将JVM的当前默认时区应用于其日期时间值。这里您可以看到我的
美国/洛杉矶
时区已应用。相比之下,java.time类使用标准格式更为合理

转储到控制台

System.out.println ( "d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts );
跑步的时候

d:2007-09-23=zdt:2007-09-23T00:00-04:00[美国/蒙特利尔]=即时:2007-09-23T04:00:00Z=ts:2007-09-22 21:00.0

顺便说一下,从JDBC4.2开始,您可以直接使用java.time类型。不需要
java.sql.Timestamp

  • PreparedStatement.setObject
  • ResultSet.getObject

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

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

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(错误:尝试System.out.println的结果!你会得到类似的结果:“2009-10-23 15:26:56.171”月是以0为基础的,所以9月是10月!我知道其中一个常量是以零为基础的,谢谢。更新后。哦,我把“未测试”:)放错了,不会编译!编译错误:09是八进制数,但9超出八进制的范围。逻辑错误:该月以0为基础,您将获得2007年10月23日。如果未编译,则无法获得逻辑错误。:)说真的,抓得好,卡洛斯。我以前抓到的八进制,但还是粘贴错了(实际上,Timestamp构造函数是非润滑的,而您可以使用Timestamp.valueOf()method@ShivaKomuravelly并非所有的时间戳构造函数都不推荐使用,至少不推荐使用毫秒长的时间戳构造函数,不推荐使用日期作为参数的构造函数,并且有一个常量(而不是月份=9):
      Calendar.septer
      因为**Date(“string”);**不推荐timestamp timestamp=timestamp.valueOf(“2007-09-23 10:10:10.0”);显示方法的valueOf对于jDK 7new timestamp(time)中的类型timestamp是未定义的;给出这样的构造函数没有接受字符串值的错误:(@Bhanu构造函数以毫秒为单位计算unix时间。如果要从字符串中获取时间戳,请使用静态方法valueOf。这似乎是该问题的最佳答案。最好的答案是Date,这是不推荐的,使用它是不好的做法。此答案更好。谢谢正常的ISO日期格式是yyyy-MM-dd,否则就太好了!新的时间戳(time);给出错误,没有像这样的构造函数接受长值:(@Bhanu)文档显示,这确实需要很长的时间,而且似乎工作正常:仅供参考,非常麻烦的旧日期时间类,例如,和
      java.text.simpleDataFormat
      ,现在被java 8和更高版本中内置的类所取代。请看。答案不错,但您遗漏了一个关键部分:时区
      java.sql.Timestamp.from (
          LocalDate.of ( 2007 , 9 , 23 )
                   .atStartOfDay( ZoneId.of ( "America/Montreal" ) )
                   .toInstant()
      )
      
      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 );