我在其他地方有一个数据库,我必须从另一个时区获取我的数据。
要获取最新更新的元素,我需要将Date
转换为数据库的时区,这样我才能在特定时间后更改行。
为了与数据库进行通信,我创建了一个包含各种static final
元素的Java类。我想添加static final DateFormat
SimpleDateFormat
和TimeZone
,因此我始终可以使用此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
,我可以在应用程序的任何地方使用它?
答案 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。