在为IST工作时,Java日期解析不适用于ET时区
我正在尝试分析到目前为止的字符串。日期格式为的字符串 “dd-MMM-yyyy Z”和值为“12-DEC-2018 ET”的字符串。这就是错误所在 java.text.ParseException:不可解析日期:“2018年12月12日东部时间” 同样的代码用于值为“12-DEC-2018 IST”的字符串。 下面是代码片段:在为IST工作时,Java日期解析不适用于ET时区,java,date,timezone,date-parsing,Java,Date,Timezone,Date Parsing,我正在尝试分析到目前为止的字符串。日期格式为的字符串 “dd-MMM-yyyy Z”和值为“12-DEC-2018 ET”的字符串。这就是错误所在 java.text.ParseException:不可解析日期:“2018年12月12日东部时间” 同样的代码用于值为“12-DEC-2018 IST”的字符串。 下面是代码片段: public static void main(String[] args) throws ParseException { String dateInputI
public static void main(String[] args) throws ParseException {
String dateInputIST ="12-DEC-2018 IST";
String dateInputET ="12-DEC-2018 ET";
SimpleDateFormat sdfmt1 = new SimpleDateFormat("dd-MMM-yyyy Z");
SimpleDateFormat sdfmt2= new SimpleDateFormat("dd/MM/yyyy");
Date dDate = sdfmt1.parse( dateInputIST );
String strOutput = sdfmt2.format( dDate );
System.out.println(strOutput);
Date etDate = sdfmt1.parse(dateInputET);
strOutput = sdfmt2.format(etDate);
System.out.println(strOutput);
}
有人能帮忙吗。我需要解析任何时区中的时间。
谢谢
纳文改变
String dateInputET ="12-DEC-2018 ET";
到
“ET”不是可识别的时区。伪时区
ET、EST和IST实际上不是时区。那些2-4个字母的伪区域没有标准化,甚至不是唯一的!例如,IST可以表示印度标准时间、爱尔兰标准时间、冰岛标准时间等
实时时区名称采用大陆/地区
格式,如非洲/突尼斯
日期和区域,分别
带时区的日期没有实际意义
将日期作为LocalDate
对象处理
String input = "12-DEC-2018"
DayeTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" , Locale.US ) ;
LocalDate ld = LocalDate.parse( input , f ) ;
ZoneId zNewYork = ZoneId.of( "America/New_York" ) ;
作为ZoneId
对象单独处理所需的时区
String input = "12-DEC-2018"
DayeTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" , Locale.US ) ;
LocalDate ld = LocalDate.parse( input , f ) ;
ZoneId zNewYork = ZoneId.of( "America/New_York" ) ;
要组合,请确定一天中的第一个时刻
ZonedDateTime zdtNewYork = ld.atStartOfDay( z ) ;
以标准ISO 8601格式生成表示该时刻的文本,扩展为将时区名称附加在方括号中
要查看UTC中的同一时刻,请提取一个Instant
Instant instant = zdtNewYork.toInstant() ;
调整到另一个区域
ZonedDateTime zdtKolkata = instant.atZone( ZoneId.of( "Asia/Kolkata" ) ) ;
要只关注日期,请通过印度使用的挂钟时间镜头查看同一时刻当天的LocalDate
LocalDate ldKolkata = zdtKolkata.toLocalDate() ;
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
类
从哪里获得java.time类
- 、和更高版本-标准Java API的一部分,带有捆绑实现。
- Java9添加了一些次要功能和修复
- 及
- 大多数java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android(java.time
在我的计算机上,此代码段的输出为:
格式模式字母
表示通用时区名称,即无论夏季时间(DST),例如东部时间或短东部时间,全年相同的名称 如果您想控制不明确时区缩写的解释(其中有很多),可以使用两个argv
其中第二个参数包含首选区域。如果有一种方法可以避免完全依赖时区缩写,那就更好了,因为正如我所说的,它们通常是模棱两可的 不过,我不知道带时区的约会有什么意义 另外,请始终为格式化程序指定区域设置,以便在更改默认区域设置或某一天您的程序在具有不同默认区域设置的JVM中运行时,格式化程序也可以工作 避免简化格式和日期appendGenericZoneText(TextStyle,Set)
我认为
无法解析您的字符串。它是一样的,因为该类已经过时很久了,并且以麻烦著称,所以无论如何您都不应该想使用它。您的意思是SimpleDataFormat
而不是EDT
?时区缩写的解析在任何情况下都是脆弱的。我至少我不知道ET
是否会被解析为冰岛、爱尔兰、以色列或印度的时间。因此,如果有任何方法,请避免依赖它们。另外,当东部时间是标准时间和EDT dirung夏季使用EST的时区的正确指定时。我建议您避免使用IST
class.它不仅已经过时很久了,而且出了名的麻烦。今天我们有了更好的。在我的电脑上,你的程序将你的IST字符串解析为2018年12月11日星期二23:00:00 CET 2018,格式是SimpleDateFormat
。日期提前一天是故意的吗?@navin kumar:有没有对你有用的答案?如果是的话考虑接受/鼓励他们。11/12/2018
Date: 2018-12-12 Time zone: Atlantic/Reykjavik Date: 2018-12-12 Time zone: America/New_York