Simpledateformat忽略setTimeZone调用

时间:2017-10-22 11:51:12

标签: java android date simpledateformat

我有以下代码:

SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.getDefault());
sdf.setTimeZone(TimeZone.getDefault());
return sdf.format(date);

当我使用日期对象调用此代码时,它会返回相同的日期(显然为String)而不设置时区。

据我所知,java.util.Date对象与时区无关。因此,如果我在SimpleDateFormat上设置时区,则应该更改。但它没有。

如果我检查sdf.getTimeZone(),那么我发现我的时区已正确设置为UTC + 03:00。

有人知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

以UTC格式获取TimeZone

 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-YYY HH:mm:ss Z",Locale.ENGLISH);

        simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

        return simpleDateFormat.format(new Date());

以上格式的结果为22-10-2017 18:05:50 UTC。

以本地格式(TimeZone of Phone或设备)获取TimeZone

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-YYY HH:mm:ss Z",Locale.ENGLISH);

            simpleDateFormat.setTimeZone(TimeZone.getDefault());

            return simpleDateFormat.format(new Date());

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-YYY HH:mm:ss Z",Locale.ENGLISH);
            return simpleDateFormat.format(new Date());

上述格式的结果为22-10-2017 18:05:50 UTC + 5:30。(提示: - 印度)

以上格式的结果为22-10-2017 18:05:50 IST。(提示: - 印度)

提示: - 如果您将此格式化的字符串传递给日期,如下所示

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-YYY HH:mm:ss Z",Locale.ENGLISH);

        simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

        Date d = null;

        try {
            d =simpleDateFormat.parse("22-10-2017 18:05:50 UTC");
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return d.toString();

返回的输出将与设备时区相同,即本地时区或默认时区。 (22-10-2017 18:05:50 UTC + 5:30或22-10-2017 18:05:50 IST)。

即使上面的时区设置为UTC,如果您将内容传递到日期对象,也只能在设备时区输出。

答案 1 :(得分:-1)

我认为,更好的方法是使用Joda Time代替。它的格式具有ZZ属性,可以为您提供所需的属性。 用法很简单:

DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ssZZ").withLocale(Locale.RU);