我使用以下简单日期格式来解析字符串
SimpleDateFormat dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
String time = "Wed Mar 06 21:00:00 IST 2014";
Date date = dateFormat.parse(time);
这不会引发任何错误,
SimpleDateFormat dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
String time = "Wed Mar 06 21:00:00 KST 2014";
Date date = dateFormat.parse(time);
抛出不可解析的日期异常。
其中, IST - 印度标准时间 * KST - 韩国标准时间 *
由于例外情况,我决定删除时区。
还有其他方法可以解决这个问题吗?
请帮忙
答案 0 :(得分:3)
两个日期都无效,因此两者都会抛出错误:
String time = "Wed Mar Thu 21:00:00 IST 2014";
星期四无效,因为EEE - Wed
组合已经消耗了星期几。你需要在那里设置一个月的日期。
尝试解析以下日期,它应该适用于您的情况:
String time = "Wed Mar 12 21:00:00 KST 2014";
答案 1 :(得分:3)
避免使用时区的3或4个字母代码。它们既不标准也不独特。例如,您引用为“印度标准时间”的IST
也“爱尔兰标准时间”。另外,它们令人困惑,实际上你可能意味着“夏令时”/“夏令时”。而是使用proper time zone names,通常由一个国家/地区加上主要城市组成。
那种格式“Wed Mar Thu 21:00:00 IST 2014”并不好。除了错误(看起来你输入“星期三”或“星期四”,你应该有一个月的数字),它使用3-4字母代码,包含多余的数据(星期几),并假设英语读者。将日期时间值作为文本移动时,请使用合理的ISO 8601格式:YYYY-MM-DDTHH:MM:SS.sssZ
,例如2014-03-04T23:20:28Z
。
如果您无法控制更改该格式,则必须确定可能在数据集中使用的所有可能的3-4个字母代码,并查看您的日期时间库是否可以处理它们。
java.util.Date和.Calendar类非常麻烦。使用新的java.time包,它们在Java 8中已经过时了。该软件包基于Joda-Time库。使用Joda-Time或java.time。
请注意,与java.util.Date相比,Joda-Time DateTime对象确实知道其指定的时区。
这是一些Joda-Time 2.3示例代码。
String inputIso = "2014-03-19T21:00:00+05:30";
DateTimeZone timeZoneIndia = DateTimeZone.forID( "Asia/Kolkata" );
DateTime dateTimeIndia = new DateTime( inputIso, timeZoneIndia );
// Adjust to Korea Time.
DateTimeZone timeZoneKorea = DateTimeZone.forID( "Asia/Seoul" );
DateTime dateTimeKorea = dateTimeIndia.withZone( timeZoneKorea );
// Adjust to UTC (GMT).
DateTime dateTimeUtc = dateTimeKorea.withZone( DateTimeZone.UTC );
String inputLame = "Thu Mar 20 21:00:00 KST 2014";
DateTimeZone timeZone = null;
if( inputLame.contains( "IST" )) { // Assume IST = India time.
timeZone = DateTimeZone.forID( "Asia/India" );
inputLame = inputLame.replace( " IST ", " ");
}
if( inputLame.contains( "KST" )) { // Assume KST = Korea time.
timeZone = DateTimeZone.forID( "Asia/Seoul" );
inputLame = inputLame.replace( " KST ", " ");
}
DateTimeFormatter formatter = DateTimeFormat.forPattern( "EEE MMM dd HH:mm:ss yyyy" ).withZone( timeZone ).withLocale( java.util.Locale.ENGLISH );
DateTime dateTimeLame = formatter.parseDateTime( inputLame );
转储到控制台...
System.out.println( "dateTimeIndia: " + dateTimeIndia );
System.out.println( "dateTimeKorea: " + dateTimeKorea );
System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "dateTimeLame: " + dateTimeLame );
跑步时......
dateTimeIndia: 2014-03-19T21:00:00.000+05:30
dateTimeKorea: 2014-03-20T00:30:00.000+09:00
dateTimeUtc: 2014-03-19T15:30:00.000Z
dateTimeLame: 2014-03-20T21:00:00.000+09:00
答案 2 :(得分:2)
尝试这段代码,看看KST是否是有效的时区ID
String[] timezoneIdArr = TimeZone.getAvailableIDs();
for (String tzId : timezoneIdArr) {
System.out.println(tzId);
}
如果没有,则输入区域ID,如“Asia / Seoul”或其他内容。这应该工作。
请注意,我没有尝试过。请检查时区的确切拼写。
更新:
尝试以下代码。看看KST产生了什么。取消注释并尝试亚洲/首尔。供您参考,取消注释并了解PST的工作原理。
private static void calTest() {
String zone = "KST";
//String zone = "Asia/Seoul";
//String zone = "PST";
long millis = System.currentTimeMillis();
//get calendar of Korea time zone.
Calendar kst = Calendar.getInstance(TimeZone.getTimeZone(zone));
//set its time to a UTC millisecond value. probably redundant, but just to demonstrate
kst.setTimeInMillis(millis);
String formattedKst = formatTime(kst);
System.out.println(" Original - " + formattedKst);
//now we convert the formatted string back to a Calendar .
Calendar parsedKst = parseTime(formattedKst, zone);
System.out.println(" Parsed - ");
System.out.println("" + parsedKst.get(Calendar.YEAR) + "-"
+ (parsedKst.get(Calendar.MONTH) + 1) + "-"
+ parsedKst.get(Calendar.DATE) + " "
+ parsedKst.get(Calendar.HOUR_OF_DAY) + ":"
+ parsedKst.get(Calendar.MINUTE) + ":"
+ parsedKst.get(Calendar.SECOND) + "."
+ parsedKst.get(Calendar.MILLISECOND) + " "
+ parsedKst.getTimeZone().getID() + " "
+ parsedKst.getTimeZone().getDisplayName() + " "
);
}
private static Calendar parseTime(String formattedDateTime, String ID) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX zzz");
sdf.setTimeZone(TimeZone.getTimeZone(ID));
sdf.setLenient(false);
try {
sdf.parse(formattedDateTime);
} catch (ParseException e) {
e.printStackTrace();
}
return sdf.getCalendar();
}
private static String formatTime(Calendar cal) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX zzz");
sdf.setCalendar(cal);
return sdf.format(cal.getTime());
}