如何更改Java中String.format()中%tZ使用的时区?

如何更改Java中String.format()中%tZ使用的时区?,java,datetime,time,date-format,Java,Datetime,Time,Date Format,在下面的代码段中,我想更改String.format() 如果您查看一下,就会发现Z模式使用了您的JVM: “Z”表示时区缩写的字符串。该值将根据夏令时的需要进行调整。对于long、long和Date,使用的时区是此Java虚拟机实例的默认时区。格式化程序的区域设置将取代参数的区域设置(如果有) 因此,最简单的方法是使用java.util.timezone类更改默认时区。一些随机时区的示例: TimeZone.setDefault(TimeZone.getTimeZone("Europe/Lon

在下面的代码段中,我想更改
String.format()

如果您查看一下,就会发现
Z
模式使用了您的JVM:

“Z”表示时区缩写的字符串。该值将根据夏令时的需要进行调整。对于long、long和Date,使用的时区是此Java虚拟机实例的默认时区。格式化程序的区域设置将取代参数的区域设置(如果有)

因此,最简单的方法是使用
java.util.timezone
类更改默认时区。一些随机时区的示例:

TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
long mls = System.currentTimeMillis();
String time = String.format("%tT %tZ", mls, mls);
System.out.println("TIME: " + time + " \n");
// get current time in London
LocalTime now = LocalTime.now(ZoneId.of("Europe/London"));
// formatter for HH:mm:ss output
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("HH:mm:ss");
System.out.println(fmt.format(now)); // 14:09:22
输出:

TIME: 18:33:05 WEST 
时间:英国夏令时14:03:54


新的Java日期/时间API 我认为这不是格式化日期的最佳方式,特别是因为它取决于系统的默认时区(可以在运行时更改并中断代码),并且它使用旧的API(
timezone
class)

现在Java有了一个新的API,使事情变得更简单

如果使用<强> java 8 < />,请考虑使用这更容易


如果您使用的是Java在Java中有很多方法可以使用时区格式化时间,
String.format()
是其中灵活性最低的一种

下面所有6个建议都假设您有一个
long
毫秒值(
mls
),并且需要设置一个从该值开始的时间格式。所有6个建议的输出都是相同的

如果您坚持使用,您可以通过多种方式控制时区:

  • 由于
    long
    long
    java.util.Date
    参数将使用JVM的默认时区,您可以使用更改它,但是这通常是一个坏主意,因此我强烈建议您不要这样做

  • 由于参数具有时区,您可以更改
    long
    毫秒参数以使用该时区:

    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Pacific/Honolulu"));
    cal.setTimeInMillis(mls);
    String time = String.format("%tT %tZ", cal, cal);
    
  • 在Java 8中,还可以使用新的
    Java.time
    对象:

    ZonedDateTime zdt = Instant.ofEpochMilli(mls).atZone(ZoneId.of("Pacific/Honolulu"));
    String time = String.format("%tT %tZ", zdt, zdt);
    
如果不必使用
String.format()
,那么应该在Java8中使用新对象。如果在Java 6或7上,您可以添加jar:

  • 用于指定时区:

    ZonedDateTime zdt = Instant.ofEpochMilli(mls).atZone(ZoneId.of("Pacific/Honolulu"));
    String time = zdt.format(DateTimeFormatter.ofPattern("HH:mm:ss z"));
    
  • 在中指定时区:

如果您使用的是Java 8之前的版本,并且不想为Three Ten Backport添加额外的jar,您可以这样做:

  • 使用:


注意:上面的所有代码都使用檀香山时间,因为这是我想要的时区。

格式化程序
类、
String.format()
和其他类使用的格式字符串接受大量日期和时间类型。例如:

    ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Europe/Lisbon"));
    String time = String.format("%tT %<tZ", zdt);
    System.out.println("TIME: " + time + " \n");
我相信在西欧的夏季是西部

并不是说你真的想输出一个四个字母的时区缩写,现在我们开始了。这些缩略语往往模棱两可,不标准化。相对于大写的
Z
时区,我更喜欢小写的
Z
表示UTC的偏移量。他们从不含糊不清。不幸的是,欧洲/里斯本这样的长时区名称似乎不是一个选择。为此,您可以使用
DateTimeFormatter

从文档中可以看出:“日期/时间-可应用于能够对日期或时间进行编码的Java类型:
日历
日期
临时助理
”。最后一个是由大多数现代日期和时间类实现的接口,包括
DayOfWeek
HijrahDate
hijrahra
Instant
IsoEra
japaneseate
JapaneseEra
LocalDateTime
LocalTime
MinguoDate
MinguoEra
MonthDay
OffsetDateTime
OffsetTime
ThaiBuddhistDate
ThaiBuddhistEra
YearMonth
YearMonth
ZonedDateTime
ZoneOffset


我正在使用
如何?那甚至不是一个日期对象……你不想把它改成什么?@ΦXocę웃Пepeúpaツ 
java.util.Formatter
接受日期/时间格式(
%t
)的
long
long
。它还接受
ZonedDateTime
。我想,给它一个时区的一种方法是。如果出于某种原因java.time包不是一个选项,那么在设置了时区后,可以将a传递给格式化程序,就像传递Long或Date或ZonedDateTime一样。如果java 8的答案是
DateTimeFormatter
,那么为什么不使用pre java 8的答案呢,您可以在哪里调用来直接控制格式化字符串的时区
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("HH:mm:ss z")
                                         .withZone(ZoneId.of("Pacific/Honolulu"));
String time = fmt.format(Instant.ofEpochMilli(mls));
SimpleDateFormat fmt = new SimpleDateFormat("HH:mm:ss z");
fmt.setTimeZone(TimeZone.getTimeZone("Pacific/Honolulu"));
String time = fmt.format(mls);
    ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Europe/Lisbon"));
    String time = String.format("%tT %<tZ", zdt);
    System.out.println("TIME: " + time + " \n");
TIME: 18:33:05 WEST