我需要将Date
对象传递到我的API正在调用的服务中。我有Date
的日期,月份和年份的信息,但还需要一个时间戳。服务期望采用以下格式:
<date>2015-04-01T00:00:00-05:00</date>
如何为日期添加一些内容以获取这种格式?
答案 0 :(得分:4)
请勿使用java.util.Date
。由java.time.Instant
取代。
获取日期部分。
LocalDate ld = LocalDate.of( 2015 , 4 , 1 ) ;
或使用可读的Month
枚举。
LocalDate ld = LocalDate.of( 2015 , Month.APRIL , 1 ) ;
获取一天中某个特定时区开始的时间。不要假设一天的开始时间是00:00:00,可能是其他时间,例如01:00:00。让 java.time 为您解决这个问题。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
以所需的格式(标准ISO 8601格式)生成字符串。
DateTimeFormatter f = DateTimeFormatter.ISO_OFFSET_DATE_TIME ;
String output = zdt.format( f ) ;
要查看UTC时刻,请提取Instant
。
Instant instant = zdt.toInstant() ;
如果必须与尚未为 java.time 更新的旧代码进行互操作,则可以调用添加到旧类中的新转换方法。其中包括Date::from( Instant )
。
java.util.Date d = java.util.Date.from( instant ) ;
往另一个方向走。
Instant instant = d.toInstant() ;
返回UTC以外的时区。
ZonedDateTime zdt = instant.atZone( ZoneId.of( "Pacific/Auckland" ) ) ; // Same moment, different wall-clock time.
答案 1 :(得分:1)
在Java中使用日期一直是一个丑陋的烂摊子。日期类现在大部分已被弃用。我正在使用LocalDateTime,您可以在其中调用年,月,日,时,分和秒来构造它。这是我能想到的:
LocalDateTime ldt = LocalDateTime.of(1997, Month.SEPTEMBER, 2, 1, 23, 0);
ZonedDateTime systemTime = ldt.atZone(ZoneId.systemDefault());
DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME; //Basil's idea
System.out.println(systemTime.format(formatter));
输出:
1997-09-02T01:23:00-05:00
答案 2 :(得分:0)
您可以为此使用SimpleDateFormat。
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
dateFormat.format(new Date());