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



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

但是为了解析solr查询,我需要以下格式的

1995-12-31T23:59:59Z

我如何在java1.6中解析它以在末尾添加"Z"?

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

当我现在选择String日期并尝试用SimpleDateFormat对象解析它时,它看起来像这个

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

使用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"放在单引号中以转义

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

避免旧日期时间类

您使用的是旧的java.util.Date/.Calendar和SimpleDateFormat类。避开他们。

Date类的toString在生成String时应用了默认时区,这是一个糟糕的设计选择。因此,它似乎有一个时区,而事实上它没有(除了一个埋在下面的时区,因为经常使用而被忽略)。令人困惑,是的。避免。

java.time

相反,使用java 8及更高版本中内置的java.time。

首先解析为没有任何时区或偏移的LocalDateTime

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

应用一个时区或UTC的偏移量,赋予此LocalDateTime意义,使其成为时间线上的实际时刻。您必须知道或询问此字符串的时区或偏移量,因为没有嵌入任何指示。对于这个例子,我将武断地假设魁北克。

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

所需输出的末尾有一个Z,而Zulu表示UTC。

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

Instant instant = zdt.toInstant();

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

String output = instant.toString();

半开

我碰巧注意到,你的榜样价值观试图达到1995年底。有一种更好的方法来执行这样的搜索或比较标准。

在日期时间工作中,最佳实践被称为半开放,其中一段时间的开始是包含,而结束是exclusive。因此,一周从周一开始,一直到下周一,但不包括下周一。

定义年份是指从1995年第一天的第一刻开始,一直到但不包括1996年下一年第一天的第二刻。搜索该范围内的任何值而不是,使用BETWEEN,而是作为:( someEvent >= firstMomentOf1995 AND someEvent < firstMomentOf1996 )(不是<=)。

相关内容

  • 没有找到相关文章

最新更新