语言环境 - 两个参数构造在行动

Locale - two argument construct in action

这是我用于日期格式化的语言环境 类 的代码片段:

List<Locale> locales = new ArrayList<>(8);
locales.add(new Locale("en"));
locales.add(new Locale("pl"));
locales.add(new Locale("en", "PL"));
locales.add(new Locale("en", "CH"));
locales.add(new Locale("en", "BR"));
locales.add(new Locale("pl", "JP"));
locales.add(new Locale("pl", "GER"));
locales.add(new Locale("pl", "DK"));
DateFormat dateInstance;
for (Locale locale : locales) {
    dateInstance = DateFormat.getDateInstance(DateFormat.FULL, locale);
    System.out.println(dateInstance.format(date));
}

我得到以下输出:

Tuesday, April 19, 2016
wtorek, 19 kwietnia 2016
Tuesday, April 19, 2016
Tuesday, April 19, 2016
Tuesday, April 19, 2016
wtorek, 19 kwietnia 2016
wtorek, 19 kwietnia 2016
wtorek, 19 kwietnia 2016

我不明白构造函数的第二个参数代表什么。提到的格式化日期不依赖于我是否将 "Country" 参数传递给构造函数这一事实。

...所以我的问题是:

双参数 Locale 构造函数是否有合适的用例?

您碰巧选择了具有相同格式的国家/地区。然而,情况并非总是如此。这是一个不同的例子:

import java.util.*;
import java.text.*;

class Test {    
    public static void main(String[] args) {
        List<Locale> locales = new ArrayList<>(8);
        locales.add(new Locale("en"));
        locales.add(new Locale("en", "GB"));
        locales.add(new Locale("en", "US"));
        Date date = new Date();
        for (Locale locale : locales) {
            DateFormat dateInstance = DateFormat.getDateInstance(DateFormat.FULL, locale);
            System.out.println(dateInstance.format(date));
        }
    }
}

输出:

Tuesday, April 19, 2016
Tuesday, 19 April 2016
Tuesday, April 19, 2016

请注意第二行与第三行的不同之处。这基本上表明英国英语日期格式与美国英语日期格式不同。

我还发现您输入的国家/地区不是传统上与您指定的语言相关联的国家/地区 - 没有 "Polish English" 或 "Swiss English" 而肯定有 a "UK English" vs "US English"(同样还有加拿大英语、澳大利亚英语等)。

如果您经过的国家/地区指定的语言是该国家/地区使用的主要语言之一,您更有可能获得针对特定国家/地区的结果。

是的,有一些情况。 Locale 不仅用于 DateFormat,您还可以在格式化货币时使用它。

double amount =200.0;
Locale locale = new Locale("es", "ES");      
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(locale);
System.out.println(currencyFormatter.format(amount));

locale = new Locale("es", "cu");      
currencyFormatter = NumberFormat.getCurrencyInstance(locale);
System.out.println(currencyFormatter.format(amount));

在此示例中,定义了西班牙和古巴的区域设置,并将格式化 200.00。

$ java HelloWorld 
200,00 €
CU0,00

如您所见,货币符号和货币符号的位置发生了变化。