java final对象DateFormat设置时区

时间:2017-10-06 10:30:58

标签: java date datetime static final

我在其他地方有一个数据库,我必须从另一个时区获取我的数据。

要获取最新更新的元素,我需要将Date转换为数据库的时区,这样我才能在特定时间后更改行。

为了与数据库进行通信,我创建了一个包含各种static final元素的Java类。我想添加static final DateFormat SimpleDateFormatTimeZone,因此我始终可以使用此FINAL DateFormat将日期更改为数据库的日期时间。应用

所以我有一个班级:

public class Data_DB {

    static final DateFormat FORMATTER= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}

我可以在我的应用程序中随处使用DateFormat,非常好。 但我也希望更改格式化程序的TimeZone

public class Data_DB {

    static final DateFormat FORMATTERSD = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    static final DateFormat FORMATTERDB = FORMATTERSD.setTimeZone(TimeZone.getTimeZone("XXXX/xxxx"));
}

FORMATTERSD.setTimeZone(TimeZone.getTimeZone("XXXX/xxxx"))的返回值无效。

我不想实例化Data_DB以向其添加TimeZone

我能以什么方式解决这个问题,以获得一个静态的最终元素FORMATTERDB,我可以在应用程序的任何地方使用它?

2 个答案:

答案 0 :(得分:2)

你可以这样做:

static final DateFormat FORMATTERSD;
    static {
        FORMATTERSD = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        FORMATTERSD.setTimeZone(TimeZone.getTimeZone("XXXX/xxxx"));
    }

静态将被调用一次。

请注意,SimpleDateFormat不是线程安全的,如果你有多个线程,它就无法工作

答案 1 :(得分:2)

请注意,SimpleDateFormat 非线程安全。所以两个线程可能同时改变静态对象的内部状态,玩乱码。

同样是最终对象,然后使用setTimeZone更改字段会更改原始对象

static DateFormat formatterSD() {
    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}

static DateFormat formatterDB() {
    DateFormat df = formatterSD(); // Must be a *new* SimpleDateFormat.
    df.setTimeZone(TimeZone.getTimeZone("XXXX/xxxx"));
    return df;
}

随着java 8出现了许多新类。起初有点压倒性,但是很有价值, 因为这样的问题在那里解决了。见LocalDateTime。