Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将不带Z的java日期转换为带Z的日期_Java_Datetime - Fatal编程技术网

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

如何将不带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

我有以下日期值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("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();