java 最终对象 DateFormat 设置时区

java final object DateFormat set timezone

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

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

为了与数据库通信,我创建了一个包含各种 static final 元素的 Java class。我想添加一个 static final DateFormat 和一个 SimpleDateFormat 和一个 TimeZone 这样我就可以随时使用这个 FINAL DateFormat 将日期更改为数据库中任何地方的日期时间申请。

所以我有一个 class:

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")) 的 return 值无效。

我不想实例化 Data_DB 来添加 TimeZone

我可以用什么方法解决这个问题以获得一个我可以在应用程序中随处使用的静态最终元素 FORMATTERDB

你可以这样做:

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

静态将被调用一次。

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

请注意 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。