Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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
Java:将带有时区缩写的日期字符串解析为日期对象_Java_Date_Timezone_Simpledateformat_Datetime Parsing - Fatal编程技术网

Java:将带有时区缩写的日期字符串解析为日期对象

Java:将带有时区缩写的日期字符串解析为日期对象,java,date,timezone,simpledateformat,datetime-parsing,Java,Date,Timezone,Simpledateformat,Datetime Parsing,我需要将带有时区的日期字符串解析为date对象。输入日期字符串模式为: "MM/dd/yyyy hh:mm a z" (eg: 04/30/2018 06:00 PM IST). 我使用了下面给出的代码。但它返回不正确的日期作为输出 new SimpleDateFormat("MM/dd/yyyy hh:mm a z").parse("04/30/2018 06:00 PM IST") 当前输出:“2018年4月30日星期一09:00:00 PDT”。 预期输出:“Mon Apr 30 0

我需要将带有时区的日期字符串解析为
date
对象。输入日期字符串模式为:

"MM/dd/yyyy hh:mm a z"  (eg: 04/30/2018 06:00 PM IST).
我使用了下面给出的代码。但它返回不正确的日期作为输出

new SimpleDateFormat("MM/dd/yyyy hh:mm a z").parse("04/30/2018 06:00 PM IST")
当前输出:
“2018年4月30日星期一09:00:00 PDT”

预期输出:
“Mon Apr 30 05:30:00 PDT 2018

生成的日期对象将不包含任何时区信息。请参阅本节中的类似查询

您可能获得了正确的日期,但在JVM的当前时区内


如果您使用的是Java 8,则会提供带有时区的Date对象。请看,但是在解析()时,您需要不同类型的格式化程序()

生成的Date对象将不包含任何时区信息。请参阅本节中的类似查询

您可能获得了正确的日期,但在JVM的当前时区内

如果您使用的是Java 8,那么就提供了带有时区的Date对象。请看,但是对于这一点,您在解析()时需要一种不同类型的格式化程序。这是因为。IST在中使用,
SimpleDateFormat
以模糊和未记录的方式(AFAIK)将其中一些设置为默认设置。实际上,:“缩写的支持仅用于JDK 1.1.x兼容性,应使用全名”

使其工作的一种方法是任意选择时区并在格式化程序中进行设置:

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm a z");
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
Date date = sdf.parse("04/30/2018 06:00 PM IST");
始终以大陆/地区的格式使用名称,例如
亚洲/加尔各答
。这些名称都是,而且不含糊,因此这会使事情顺利进行

java.time API 如果您使用的是Java8或更高版本,请切换到,这会更好。对于Java7或更低版本,有相同的类和功能

在此API中,您必须设置所有首选时区的列表,以便在名称不明确时使用,如IST

// prefered zones
Set<ZoneId> preferredZones = new HashSet<>();
preferredZones.add(ZoneId.of("Asia/Kolkata"));

DateTimeFormatter fmt = new DateTimeFormatterBuilder()
    // date and time
    .appendPattern("MM/dd/yyyy hh:mm a ")
    // zone (use set of prefered zones)
    .appendZoneText(TextStyle.SHORT, preferredZones)
    // use English, because different locales can affect timezones names
    .toFormatter(Locale.ENGLISH);

ZonedDateTime zdt = ZonedDateTime.parse("04/30/2018 06:00 PM IST", fmt);
这是因为。IST在中使用,
SimpleDataFormat
以模糊和未记录的方式(AFAIK)假定其中一些为默认值。实际上,:“缩写的支持仅用于JDK 1.1.x兼容性,应使用全名”

使其工作的一种方法是任意选择时区并在格式化程序中进行设置:

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm a z");
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
Date date = sdf.parse("04/30/2018 06:00 PM IST");
始终以大陆/地区的格式使用名称,例如
亚洲/加尔各答
。这些名称都是,而且不含糊,因此这会使事情顺利进行

java.time API 如果您使用的是Java8或更高版本,请切换到,这会更好。对于Java7或更低版本,有相同的类和功能

在此API中,您必须设置所有首选时区的列表,以便在名称不明确时使用,如IST

// prefered zones
Set<ZoneId> preferredZones = new HashSet<>();
preferredZones.add(ZoneId.of("Asia/Kolkata"));

DateTimeFormatter fmt = new DateTimeFormatterBuilder()
    // date and time
    .appendPattern("MM/dd/yyyy hh:mm a ")
    // zone (use set of prefered zones)
    .appendZoneText(TextStyle.SHORT, preferredZones)
    // use English, because different locales can affect timezones names
    .toFormatter(Locale.ENGLISH);

ZonedDateTime zdt = ZonedDateTime.parse("04/30/2018 06:00 PM IST", fmt);

您当前的输出是什么?您期望的是什么?应该使用“MM/dd/yyyyy hh:MM a z”而不是“MM/dd/yyyy hh:MM a z”。一天中的H小时(0-23)。上午/下午的H小时(1-12)@MikitaHerasiutsin:谢谢。我只使用了hh。这是一个打字错误。@NisheethShah:当前输出:“Mon-Apr 30 09:00 PDT 2018”预期输出:2018年4月30日星期一05:30:00 PDT“@Salman将澄清发布为对您的问题的编辑,而不是评论。您的读者不必通过梳理评论来理解您的问题。您当前的输出是什么以及您的期望是什么?应使用“MM/dd/yyyyy hh:MM a z”而不是“MM/dd/yyyyy hh:MM a z”。H-一天中的小时数(0-23).h-上午/下午(1-12)时数@MikitaHerasiutsin:谢谢。我只使用了hh。这是一个打字错误。@Nisheethsah:当前输出:“2018年4月30日星期一09:00:00 PDT”预期输出:“2018年4月30日星期一05:30:00 PDT”“@Salman将澄清发布为对您的问题的编辑,而不是评论。您的读者不必通过梳理评论来理解您的问题。谢谢:)我已经实施了您的第一种方法,并按预期工作。谢谢:)我已经实施了您的第一种方法,并按预期工作。