Java DateFormat parse() doesn't respect the timezone

后端 未结 3 1108
小蘑菇
小蘑菇 2021-01-01 21:01
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("America/New_York"));
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
df.         


        
3条回答
  •  执笔经年
    2021-01-01 21:21

    DateFormat.parse() is NOT a query (something that returns a value and doesn't change the state of the system). It is a command which has the side-effect of updating an internal Calendar object. After calling parse() you have to access the timezone either by accessing the DateFormat's Calendar or calling DateFormat.getTimeZone(). Unless you want to throw away the original timezone and use local time, do not use the returned Date value from parse(). Instead use the calendar object after parsing. And the same is true for the format method. If you are going to format a date, pass the calendar with the timezone info into the DateFormat object before calling format(). Here is how you can convert one format to another format preserving the original timezone:

        DateFormat originalDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy");
        DateFormat targetDateFormat = new SimpleDateFormat("EEE., MMM. dd, yyyy");
    
        originalDateFormat.parse(origDateString);
        targetDateFormat.setCalendar(originalDateFormat.getCalendar());
        return targetDateFormat.format(targetDateFormat.getCalendar().getTime());
    

    It's messy but necessary since parse() doesn't return a value that preserves timezone and format() doesn't accept a value that defines a timezone (the Date class).

提交回复
热议问题