用Java打印带有时区的本地化日期
我想用Java创建当前日期的本地化版本,没有时间,但带有用户的时区 java.time.format.FormatStyle的值为-FULL:用Java打印带有时区的本地化日期,java,date,timezone,java-time,datetimeformatter,Java,Date,Timezone,Java Time,Datetimeformatter,我想用Java创建当前日期的本地化版本,没有时间,但带有用户的时区 java.time.format.FormatStyle的值为-FULL: Full text style, with the most detail. For example, the format might be 'Tuesday, April 12, 1952 AD' or '3:30:42pm PST'. 而且很长 Long text style, with lots of detail. For example,
Full text style, with the most detail. For example, the format might be 'Tuesday, April 12, 1952 AD' or '3:30:42pm PST'.
而且很长
Long text style, with lots of detail. For example, the format might be 'January 12, 1952'.
我基本上想要两者的混合-我只想显示本地化的长日期,比如:1952年1月12日-但是我想添加这个日期的时区,
太平洋标准时间1952年1月12日或墨西哥经济区1952年1月12日等
我试过:
ZonedDateTime dateTime = zonedDateTime(instant, timezoneId);
DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG).withLocale(userLocale);
String localizedDate = dateTime.format( dateFormatter.withZone(timezoneId));
但这并没有将时区添加到日期中。当我也打印出时间时,它会起作用,但在本例中,这不是我想要的。Update
OP提到他希望使用特定于语言环境的模式,但输出为英语。为此,可用于获取特定于区域设置的模式,然后在DateTimeFormatter
和locale.ENGLISH
中使用相同的模式
演示:
import java.time.Instant;
import java.time.ZoneId;
import java.time.chrono.IsoChronology;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.FormatStyle;
import java.time.format.TextStyle;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
ZoneId timezoneId = ZoneId.of("America/Los_Angeles");
Instant instant = Instant.now();
Locale userLocale = Locale.forLanguageTag("fr");
String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle.LONG, null,
IsoChronology.INSTANCE, userLocale);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(pattern, Locale.ENGLISH);
System.out.println(instant.atZone(timezoneId).format(dtf) + " "
+ timezoneId.getDisplayName(TextStyle.SHORT_STANDALONE, Locale.ENGLISH));
}
}
18 January 2021 PT
18 janvier 2021, PST
18 janvier 2021, PST
输出:
import java.time.Instant;
import java.time.ZoneId;
import java.time.chrono.IsoChronology;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.FormatStyle;
import java.time.format.TextStyle;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
ZoneId timezoneId = ZoneId.of("America/Los_Angeles");
Instant instant = Instant.now();
Locale userLocale = Locale.forLanguageTag("fr");
String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle.LONG, null,
IsoChronology.INSTANCE, userLocale);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(pattern, Locale.ENGLISH);
System.out.println(instant.atZone(timezoneId).format(dtf) + " "
+ timezoneId.getDisplayName(TextStyle.SHORT_STANDALONE, Locale.ENGLISH));
}
}
18 January 2021 PT
18 janvier 2021, PST
18 janvier 2021, PST
对于测试:将上述代码中的userLocale
的值更改为Locale.US
,输出将更改如下:
January 18, 2021 PT
原始答案 关于原始答案,请注意以下内容: 对于任何语言环境,基于样式的版本(之前的部分)和基于模式的版本(之后的部分)都是不等效的 在Java-10之前: 输出:
import java.time.Instant;
import java.time.ZoneId;
import java.time.chrono.IsoChronology;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.FormatStyle;
import java.time.format.TextStyle;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
ZoneId timezoneId = ZoneId.of("America/Los_Angeles");
Instant instant = Instant.now();
Locale userLocale = Locale.forLanguageTag("fr");
String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle.LONG, null,
IsoChronology.INSTANCE, userLocale);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(pattern, Locale.ENGLISH);
System.out.println(instant.atZone(timezoneId).format(dtf) + " "
+ timezoneId.getDisplayName(TextStyle.SHORT_STANDALONE, Locale.ENGLISH));
}
}
18 January 2021 PT
18 janvier 2021, PST
18 janvier 2021, PST
自Java-10以来:
您可以按如下所示使用:
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
ZonedDateTime dateTime = ZonedDateTime.now(ZoneId.of("America/Los_Angeles"));
Locale locale = Locale.forLanguageTag("fr");
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd MMMM uuuu, z")
.localizedBy(locale);
String strLocalizedDate = dateTime.format(dateFormatter);
System.out.println(strLocalizedDate);
}
}
输出:
import java.time.Instant;
import java.time.ZoneId;
import java.time.chrono.IsoChronology;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.FormatStyle;
import java.time.format.TextStyle;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
ZoneId timezoneId = ZoneId.of("America/Los_Angeles");
Instant instant = Instant.now();
Locale userLocale = Locale.forLanguageTag("fr");
String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle.LONG, null,
IsoChronology.INSTANCE, userLocale);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(pattern, Locale.ENGLISH);
System.out.println(instant.atZone(timezoneId).format(dtf) + " "
+ timezoneId.getDisplayName(TextStyle.SHORT_STANDALONE, Locale.ENGLISH));
}
}
18 January 2021 PT
18 janvier 2021, PST
18 janvier 2021, PST
实际上,我想使用给定区域设置的格式-因此根据区域设置,年、月、日期的顺序-您的版本使用静态日期模式。现在,我使用的是:DateTimeFormatter dateFormatter=DateTimeFormatter.ofCalizedDate(FormatStyle.LONG).withLocale(userLocale);字符串myDate=instant.atZone(timezoneId).format(dateFormatter)+“”+timezoneId.getDisplayName(TextStyle.SHORT\u独立,userLocale);这几乎是可行的,但它也使用了在给定区域中本地化的月份名称,而不是使用英语。基于样式的版本(你的前一部分)和基于模式的版本(你的后一部分)对于任何区域都不等效。@MarcusBiel-我根据你的澄清发布了一个更新。我希望它能满足你的要求。如有任何疑问/问题,请随时发表评论。