【问题标题】:java final object DateFormat set timezonejava最终对象DateFormat设置时区
【发布时间】:2017-10-06 10:30:57
【问题描述】:

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

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

为了与数据库通信,我创建了一个包含各种 static final 元素的 Java 类。我想添加一个static final DateFormat 和一个SimpleDateFormat 和一个TimeZone,这样我就可以随时使用这个最终的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"))的返回值是void。

我不想实例化Data_DB 以将TimeZone 添加到其中。

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

【问题讨论】:

  • 似乎是一个愚蠢的问题(-1)所以我会删除它,不过感谢您的帮助=^)
  • @Hugo 你能删除这个问题吗?看来我做不到=^(

标签: java date datetime static final


【解决方案1】:

你可以这样做:

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

静态将被调用一次。

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

【讨论】:

  • 非常感谢,效果很好 =^) Data_DB.FORMATTERSD.format(new Date()) 确实给出了正确的结果 =^)
【解决方案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。

【讨论】:

  • 我已经在研究如何使其线程安全。现在不需要它,但最好尽可能安全。在您的解决方案中,您添加功能来解决这个问题。我宁愿使用没有实例化或函数的静态最终元素,只需简单地调用 Data_DB.FORMATTERSD 以及格式化程序形式中接下来出现的任何内容(必须更改它以匹配数据库中的 TIMESTAMP)。如果我找到它,我会在这里发布它作为答案,谢谢=^)
  • @irJvV 一个可变单例常量的可怕之处在于,一个白痴可以使用它,设置他的波利尼西亚时区,然后其他部分就搞砸了。 Java 8 确实在新的时间类中解决了这个问题。也许创建一个没有可用设置器的子类。
  • @irJvV 线程安全格式化程序的最佳替代方案是使用 Java 8 的 new java.time API - 它还具有解决 DateSimpleDateFormatmany problemsdesign issues 的优势.对于 JDK 6 和 7,您可以使用 ThreeTen Backport。另见herehere
  • 没错,java.time 类起初可能看起来势不可挡。但是只需在 Stack Overflow 上搜索主要类名,然后通过阅读示例代码轻松掌握它的窍门:Instant、OffsetDateTime、ZonedDateTime、ZoneId、LocalDate、LocalDateTime 和 DateTimeFormatter。
  • @Joop Eggen 在测试了所有选项后,我决定将 Java 应用程序转变为多线程应用程序,因此我将使用您的解决方案。 (Tuco 给出了问题的答案,所以我接受了他的回答)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多