如何将不带Z的java日期转换为带Z的日期
我有以下日期值1995-12-31T23:59:59 但是为了解析solr查询,我需要下面的格式 1995-12-31T23:59:59Z 在Java1.6中,如何解析它以在末尾添加“Z” 转换后的类型必须为java.util.date-fyi 当我现在字符串日期并尝试用SimpleDataFormat对象解析它时,它看起来是这样的 “2001年1月1日星期一00:00:00 CST”-转换为什么格式?使用SimpleDataFormat:如何将不带Z的java日期转换为带Z的日期,java,datetime,Java,Datetime,我有以下日期值1995-12-31T23:59:59 但是为了解析solr查询,我需要下面的格式 1995-12-31T23:59:59Z 在Java1.6中,如何解析它以在末尾添加“Z” 转换后的类型必须为java.util.date-fyi 当我现在字符串日期并尝试用SimpleDataFormat对象解析它时,它看起来是这样的 “2001年1月1日星期一00:00:00 CST”-转换为什么格式?使用SimpleDataFormat: SimpleDateFormat df = new
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”是Zulu时区的缩写,即UTC。如果solr API接受date对象,则可以通过设置首选时区以以下方式解析日期:
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和SimpleDataFormat类。避开它们
Date类的toString
设计选项很差,在生成字符串时应用了默认时区。因此,它似乎有一个时区,而事实上它没有(除了埋在下面的一个被忽略的正常使用)。令人困惑,是的。避免它
java.time
而是使用java 8及更高版本中内置的java.time
首先解析为不带任何时区或偏移量的
LocalDateTime ldt = LocalDateTime.parse( "1995-12-31T23:59:59Z" );
应用或赋予此LocalDateTime
含义,使其成为时间线上的实际时刻。您必须知道或询问,由于未嵌入任何指示,此字符串的目的是什么时区或偏移量。对于这个例子,我将任意假设
您所需的输出端有一个Z
,表示Zulu
在java.time中,时间代表UTC时间线上的一个时刻。您可以从中提取即时
“类”方法生成所需格式的字符串。该格式是标准格式之一
半开
我碰巧注意到你的示例值试图得到1995年底。有一种更好的方法来执行此类搜索或比较标准
在日期-时间工作中,最佳实践称为半开放式,其中一段时间的开始是包容性的,而结束是排他性的。因此,一周从周一开始,一直持续到下周一,但不包括下周一
定义年份是指从1995年第一天的第一个时刻开始,一直到但不包括下一年1996年第一天的第一个时刻。搜索该范围内的任何值时不使用BETWEEN,而是使用:
(someEvent>=firstMomentOf1995和someEvent
(根据这一点,Z应该有自己的含义。所以我不确定这是OP想要的。read!用单引号将Z括起来,它将被转义。Z表示时区,但一些xml表示法会附加一个随机的Z来增加解析的乐趣。如果OP的实际日期字符串具有时区偏移量(la-0700)然后,他/她应该取消引用Z,它将被解析为数字时区偏移量。如果它是实际的“Z”,这是OP的问题,他/她应该将其包含在单引号中的格式中。请记住,“Z”字符表示它是UTC时间,因此您可能需要执行必要的区域转换。我的假设是他有字符串“1995-12-31T23:59:59Z”,很可能是从xs:date时间戳中检索到的,需要将其转换为Solr API的日期对象。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
Instant instant = zdt.toInstant();
String output = instant.toString();