java最终对象日期格式集时区

java最终对象日期格式集时区,java,date,datetime,static,final,Java,Date,Datetime,Static,Final,我在其他地方有一个数据库,我必须从另一个时区获取数据 要获取最新更新的元素,我需要将日期转换为数据库的时区,这样我只能在特定时间后更改行 为了与数据库通信,我创建了一个Java类,其中包含所有类型的静态final元素。我想添加一个带有SimpleDateFormat和时区的静态最终日期格式,这样我就可以始终使用这个最终的DateFormat在应用程序中的任何地方将日期更改为数据库的日期时间 所以我有一门课: public class Data_DB { static final Dat

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

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

为了与数据库通信,我创建了一个Java类,其中包含所有类型的
静态final
元素。我想添加一个带有
SimpleDateFormat
时区的
静态最终日期格式
,这样我就可以始终使用这个最终的
DateFormat
在应用程序中的任何地方将日期更改为数据库的日期时间

所以我有一门课:

public class Data_DB {

    static final DateFormat FORMATTER= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
我可以在我的应用程序的任何地方使用
DateFormat
,非常好。 但是我也想更改格式化程序的
时区

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\u DB
来添加
时区

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

您可以这样做:

static final DateFormat FORMATTERSD;
    static {
        FORMATTERSD = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        FORMATTERSD.setTimeZone(TimeZone.getTimeZone("XXXX/xxxx"));
    }
静态数据将被调用一次


请注意,SimpleDataFormat不是线程安全的,如果您有多个线程,它将无法工作

请注意,
SimpleDataFormat
非线程安全的。因此,两个线程可能会同时改变静态对象的内部状态,造成混乱

也是最后一个对象,然后使用
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;
}
Java8带来了许多新类。一开始有点势不可挡,但沃思威尔,
随着这些问题在那里得到解决。请参阅LocalDateTime。

非常感谢,这很好用=^)Data\u DB.FORMATTERSD.format(new Date())确实给出了正确的结果=^)我已经在研究如何使其线程安全。现在不需要它,但最好尽可能安全。在解决方案中,可以添加函数来解决此问题。我宁愿使用一个没有实例化或函数的静态final元素,只需对Data_DB.FORMATTERSD进行简单的调用,然后使用格式化程序表单中的任何内容(必须将其更改为数据库中的时间戳)。如果我找到了它,我会把它作为一个答案贴在这里,谢谢。@irJvV一个可变单态常数的可怕的事情是,一个白痴可以使用它,设置他的波利尼西亚时区,然后其他部分就乱七八糟了。Java8确实在新的时间类中解决了这个问题。可能在没有可用setter的情况下生成子类。@IRJV线程安全格式化程序的最佳替代方法是使用Java 8,它还具有解决问题和
Date
simpleDataFormat
的优点。对于JDK 6和7,您可以使用。同样,java.time类一开始可能看起来很强大。但只需搜索堆栈溢出中的主要类名,并通过阅读示例代码轻松解决问题:Instant、OffsetDateTime、ZonedDateTime、ZoneId、LocalDate、LocalDateTime、,和DateTimeFormatter.@Joop Eggen在测试了所有选项后,我决定将Java应用程序转换为多线程应用程序,以便使用您的解决方案。(Tuco给出了问题的答案,但我接受了他的答案)这似乎是一个愚蠢的问题(-1),所以我将删除它,谢谢你的帮助=^)@Hugo你能删除这个问题吗?似乎我做不到这一点=^(我不能: