这个问题相当复杂,我不知道之前是否曾被问过,因为我不知道如何在搜索框中说出问题。
以下是代码:
public class SomeClass
{
private static final DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
public static String toUTCDateString(Date date)
{
df.setTimeZone(java.util.TimeZone.getTimeZone("UTC"));
return df.format(date);
}
/* more static methods */
}
静态成员df
将在更多静态方法中重新使用,但我需要先将其时区设置为“UTC”。有没有办法只召唤.setTimeZone("UTC")
一次又一次?或者我是否必须在每个静态方法中调用.setTimeZone("UTC")
?
答案 0 :(得分:7)
使用Static Initialization Blocks
静态初始化块是用大括号{}括起来的常规代码块,前面是static关键字。这是一个例子:
static {
// whatever code is needed for initialization goes here
}
一个类可以有任意数量的静态初始化块,它们可以出现在类体中的任何位置。运行时系统保证按照它们在源代码中出现的顺序调用静态初始化块。
示例代码:
public class SomeClass
{
private static final DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
//Static Initialization Blocks
static{
df.setTimeZone(java.util.TimeZone.getTimeZone("UTC"));
}
public static String toUTCDateString(Date date)
{
return df.format(date);
}
/* more static methods */
}
答案 1 :(得分:3)
可惜! SimpleDateFormat不是trread-safe:它保持内部状态,并且在出现混乱的同时使用。
这会“解决”您的问题,因为您必须更改API。
public static DateFormat df()
{
DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
df.setTimeZone(java.util.TimeZone.getTimeZone("UTC"));
return df;
}
在Java 8中使用其他更好的类,这个问题就解决了。
顺便说一下,yyyy-MM-dd是ISO标准。