我有以下日期值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 )
(不是<=)。