Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java打印带有时区的本地化日期_Java_Date_Timezone_Java Time_Datetimeformatter - Fatal编程技术网

用Java打印带有时区的本地化日期

用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,

我想用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, 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-我根据你的澄清发布了一个更新。我希望它能满足你的要求。如有任何疑问/问题,请随时发表评论。