IST和KST中的简单日期格式

时间:2014-03-06 05:45:06

标签: java simpledateformat

我使用以下简单日期格式来解析字符串

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 - 韩国标准时间 *

由于例外情况,我决定删除时区。

还有其他方法可以解决这个问题吗?

请帮忙

3 个答案:

答案 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.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());
}