如何更改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
参数将使用JVM的默认时区,您可以使用更改它,但是这通常是一个坏主意,因此我强烈建议您不要这样做java.util.Date
- 由于参数具有时区,您可以更改
毫秒参数以使用该时区: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"));
- 在中指定时区:
- 使用:
注意:上面的所有代码都使用檀香山时间,因为这是我想要的时区。格式化程序
类、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