如何将没有Z的java日期转换为带Z的日期

时间:2011-06-21 17:01:02

标签: java datetime

我有以下日期值1995-12-31T23:59:59

但是为了解析这个solr查询,我需要它采用以下格式

1995-12-31T23:59:59Z

如何解析这个以在java 1.6中添加“Z”?

转换后的类型必须是java.util.date - fyi

当我现在将日期定义并尝试使用SimpleDateFormat对象解析它时,它看起来像这样

“Mon Jan 01 00:00:00 CST 2001” - 转换它的格式是什么?

3 个答案:

答案 0 :(得分:5)

使用SimpleDateFormat:

  SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
  Date d = df.parse("1995-12-31T23:59:59Z");
  System.out.println(d);

将'Z'放在单引号中以逃脱

答案 1 :(得分:0)

“Z”是祖鲁时区的时区缩写,即UTC。如果solr API接受日期对象,那么您可以通过设置首选时区以下列方式解析日期:

SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
dateParser.setTimeZone(TimeZone.getTimeZone("Z"));
Date date = df.parse("1995-12-31T23:59:59");

如果需要将其转换回字符串,请使用nsfyn55提供的方法:

SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
System.out.println(dateFormatter.format()); 

答案 2 :(得分:-1)

避免旧的日期时间类

您正在使用旧的java.util.Date/.Calendar和SimpleDateFormat类。避免它们。

Date类在生成String时应用默认时区toString的设计选择很差。所以它似乎有一个时区,实际上它没有(除了一个埋在下面,被忽略的常规使用)。令人困惑,是的。避免它。

java.time

而是使用Java 8及更高版本中内置的java.time。

首先解析为LocalDateTime,没有任何时区或偏移量。

LocalDateTime ldt = LocalDateTime.parse( "1995-12-31T23:59:59Z" );

应用time zoneoffset-from-UTC赋予此LocalDateTime含义,使其成为时间轴上的实际时刻。您必须知道或询问此字符串的时区或偏移量,因为没有嵌入任何指示。对于这个例子,我将任意假设Québec

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );

您想要的输出结尾有ZZulu表示UTC

在java.time中,Instant代表UTC时间轴上的一个时刻。您可以从ZonedDateTime中提取Instant

Instant instant = zdt.toInstant();

Instant类'toString方法生成所需格式的字符串。该格式是标准ISO 8601格式之一。

String output = instant.toString();

半开

我碰巧注意到你的示例价值试图到了1995年底。有一种更好的方法来做这样的搜索或比较标准。

在日期时间工作中,最佳做法称为半开放,其中一段时间​​的开始是包含,而结尾是独占。因此,一周从星期一开始,一直持续到下周一,但不包括在内。

定义一年意味着从1995年第一天的第一个时刻开始,直到但不包括1996年第一天的第一个时刻。搜索任何值在该范围内,使用BETWEEN 但是:( someEvent >= firstMomentOf1995 AND someEvent < firstMomentOf1996 )(不是&lt; =)。