我正在尝试根据给定的区域设置以不同的方式格式化 Java 中的日期。例如,我希望英语用户看到“Nov 1, 2009”(格式为“MMM d, yyyy”),挪威用户看到“1.十一月2009”(“d.嗯。yyyy”)。

如果我将区域设置添加到 SimpleDateFormat 构造函数中,月份部分就可以正常工作,但是其余部分呢?

我希望可以将与区域设置配对的格式字符串添加到 SimpleDateFormat,但我找不到任何方法来做到这一点。是否可能或者我需要让我的代码检查区域设置并添加相应的格式字符串?

有帮助吗?

解决方案

使用 DateFormat.getDateInstance(int 样式, Locale 语言环境) 而不是创建自己的模式 SimpleDateFormat.

其他提示

SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE dd MMM yyyy", Locale.ENGLISH);
String formatted = dateFormat.format(the_date_you_want_here);

使用的风格+区域设置 DateFormat.getDateInstance(INT风格,区域设置区域)

检查 HTTP://java.sun的.com / J2SE / 1.5.0 /文档/ API / JAVA /文本/ DateFormat.html

运行以下示例看到的差异:

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

public class DateFormatDemoSO {
  public static void main(String args[]) {
    int style = DateFormat.MEDIUM;
    //Also try with style = DateFormat.FULL and DateFormat.SHORT
    Date date = new Date();
    DateFormat df;
    df = DateFormat.getDateInstance(style, Locale.UK);
    System.out.println("United Kingdom: " + df.format(date));
    df = DateFormat.getDateInstance(style, Locale.US);
    System.out.println("USA: " + df.format(date));   
    df = DateFormat.getDateInstance(style, Locale.FRANCE);
    System.out.println("France: " + df.format(date));
    df = DateFormat.getDateInstance(style, Locale.ITALY);
    System.out.println("Italy: " + df.format(date));
    df = DateFormat.getDateInstance(style, Locale.JAPAN);
    System.out.println("Japan: " + df.format(date));
  }
}

输出:

United Kingdom: 25-Sep-2017
USA: Sep 25, 2017
France: 25 sept. 2017
Italy: 25-set-2017
Japan: 2017/09/25

tl博士

LocalDate.now().format(
    DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM )
                     .withLocale( new Locale( "no" , "NO" ) )
)

麻烦类的 java.util.DateSimpleDateFormat 现在的遗产,取代了通过java。时间课程。

LocalDate

LocalDate 类表示一个日期只有价值没有时间和没有时区。

一次区域至关重要的是在确定一个日期。对于任何给定的时刻,日期不同世界各地的区域。例如,几分钟后在午夜 巴黎法国 是新的一天,同时仍然"昨天"在 蒙特利尔魁北克.

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

DateTimeFormatter

使用 DateTimeFormatter 产生串仅占的日期或部分时间的部分。

DateTimeFormatter 类可以自动 本地化.

本地化,指定:

  • FormatStyle 确定如何长或缩写应串。
  • Locale 来确定(a)人类的语言翻译的姓名,名个月,这样,和(b)的文化准则决定的问题的缩写、资本、标点符号等。

例如:

Locale l = Locale.CANADA_FRENCH ; 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( l );
String output = ld.format( f );

去另一个方向,可以分析本地化串。

LocalDate ld = LocalDate.parse( input , f );

注意到区域和次区是完全正交的问题。你可以有一个蒙特利尔时刻提出的在日本语言或新西兰奥克兰的时刻提出在印地语言。

另一个例子:改变 6 junio 2012 (西班牙), 2012-06-06 (标准 ISO8601 格式)。Java.时间类使用的ISO8601格式正在通过默认的用于解析/产生串。

String input = "6 junio 2012";
Locale l = new Locale ( "es" , "ES" );
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "d MMMM uuuu" , l );
LocalDate ld = LocalDate.parse ( input , f );
String output = ld.toString();  // 2012-06-06. 

仔细阅读的格式

这里是一些例子码阅读的结果多种格式在多个选择,自动局部化。

一个 EnumSet 是一个实现的 Set, 高度优化为低存储器的使用和快速执行的速度,当收集 Enum 对象。所以, EnumSet.allOf( FormatStyle.class ) 给了我们一个集合的所有四个 FormatStyle 枚举的对象循环。更多信息,请参阅 Oracle教程在枚举的类型.

LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 );

List < Locale > locales = new ArrayList <>( 3 );
locales.add( Locale.CANADA_FRENCH );
locales.add( new Locale( "no" , "NO" ) );
locales.add( Locale.US );

// Or use all locales (almost 800 of them, for about 120K text results).
// Locale[] locales = Locale.getAvailableLocales(); // All known locales. Almost 800 of them.

for ( Locale locale : locales )
{
    System.out.println( "------|  LOCALE: " + locale + " — " + locale.getDisplayName() + "  |----------------------------------" + System.lineSeparator() );

    for ( FormatStyle style : EnumSet.allOf( FormatStyle.class ) )
    {
        DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( style ).withLocale( locale );
        String output = ld.format( f );
        System.out.println( output );
    }
    System.out.println( "" );
}
System.out.println( "« fin »" + System.lineSeparator() );

输出。

------|  LOCALE: fr_CA — French (Canada)  |----------------------------------

mardi 23 janvier 2018
23 janvier 2018
23 janv. 2018
18-01-23

------|  LOCALE: no_NO — Norwegian (Norway)  |----------------------------------

tirsdag 23. januar 2018
23. januar 2018
23. jan. 2018
23.01.2018

------|  LOCALE: en_US — English (United States)  |----------------------------------

Tuesday, January 23, 2018
January 23, 2018
Jan 23, 2018
1/23/18

« fin »

关于 java。时间

java。时间 框架是建立成Java8和后。这些类别取代的麻烦老 遗产 日间课程,例如 java.util.Date, Calendar, & SimpleDateFormat.

乔达时 项目,现在 维护模式, 建议迁移到 java。时间 课程。

若要了解更多信息,请参见的 Oracle教程.和搜索堆溢出许多实例和解释。说明书 JSR310.

你可以交换 java。时间 对象直接用您的数据库。使用 JDBC驱动程序 符合 JDBC4.2 或者以后。没有必要为串,不需要 java.sql.* 课程。

在那里获得java。时间上课?

ThreeTen-额外的 项目的延伸java。时与附加课程。这个项目是一个试验场于今后可能增加java。时间。你可以找一些有用的类在这里 Interval, YearWeek, YearQuarter, , 更多.

日期字符串的位置:

根据redsonic的讯息:

private String localizeDate(String inputdate, Locale locale) { 

    Date date = new Date();
    SimpleDateFormat dateFormatCN = new SimpleDateFormat("dd-MMM-yyyy", locale);       
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy");


    try {
        date = dateFormat.parse(inputdate);
    } catch (ParseException e) {
        log.warn("Input date was not correct. Can not localize it.");
        return inputdate;
    }
    return dateFormatCN.format(date);
}

String localizedDate = localizeDate("05-Sep-2013", new Locale("zh","CN"));

会像05-九月-2013

这将根据用户的当前区域显示日期

要返回的日期和时间:

import java.text.DateFormat;    
import java.util.Date;

Date date = new Date();
DateFormat df = DateFormat.getDateTimeInstance();
String myDate = df.format(date);

1969年12月31日下午7时○○分02秒

要返回日期只,使用:

DateFormat.getDateInstance() 

1969年12月31日

String text = new SimpleDateFormat("E, MMM d, yyyy").format(date);

<强>爪哇8样式对于给定的日期

LocalDate today = LocalDate.of(1982, Month.AUGUST, 31);
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.ENGLISH)));
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.FRENCH)));
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.JAPANESE)));

Java8

 import java.time.format.DateTimeFormatter;         
 myDate.format(DateTimeFormatter.ofPattern("dd-MMM-YYYY",new Locale("ar")))
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top