在 Java 公历中设置语言环境
Setting up locale in Java Gregorian Calendar
Java API 指的是IANA Language Subtag Registry(region下)查找国家代码。在 IANA 网站中,英国的区域代码是 GB。但是,使用 GB:
设置 GregorianCalendar
对象
import java.util.*;
class MainClass{
public static void main (String[] args) {
GregorianCalendar date1 = new GregorianCalendar(Locale.GB);
int year = date1.get(GregorianCalendar.YEAR);
int weekday = date1.get(GregorianCalendar.DAY_OF_WEEK);
System.out.println(year);
System.out.println(weekday);
}
}
导致出现以下错误消息:
cannot find symbol
symbol: variable GB
location: class locale
请问我应该怎么做?
语言环境 class 中的常量是国家名称,而不是国家代码。例如,有 Locale.ITALY
,但没有 Locale.IT
。这就是为什么也没有 Locale.GB
.
您所指的代码是 ISO 3166 alpha-2 国家/地区代码。它们仅用作 Locale 构造函数中的参数。之后如何命名此对象取决于您。
尝试Locale.UK让你的代码编译。
其他答案正确。
java.time
这是您的代码的当前版本:
LocalDate today = LocalDate.now(ZoneId.of("Europe/London"));
int year = today.getYear();
DayOfWeek weekday = today.getDayOfWeek();
System.out.println(year);
System.out.println(weekday);
今天(6 月 17 日)的输出是
2018
SUNDAY
到目前为止,您甚至不需要语言环境(但时区很重要,当然,您可能还想针对特定语言环境设置日期格式)。
我们将区域设置传递给 GregorianCalendar
的原因(在过去我们使用 class)是因为它决定了周计划:一周的第一天是星期六、星期日或星期一取决于地区。今天,如果您需要针对特定语言环境的周计划,您应该使用 WeekFields
class 及其静态 of(Locale)
方法。
GregorianCalendar
class 早就过时了。设计的也很差,所以我建议你不要使用它。
在下面的函数中,我试图将 TimeZone "Asia/Singapore" 设置为以 "yyy-MM-dd" 格式发送的日期字符串,您甚至可以将 dateString 格式作为另一个参数传递,并将其设置为 SimpleDateFormat 对象,这是如何在 GregorianCalendar 中本地化时间的完美解决方案。
public static GregorianCalendar getGregorianCalendarFromDateString(String dateString) {
GregorianCalendar gregCal = null;
try {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
formatter.setTimeZone(TimeZone.getTimeZone("Asia/Singapore"));
Date date = formatter.parse(dateString);
gregCal = new GregorianCalendar();
gregCal.setTime(date);
gregCal.setTimeZone(TimeZone.getTimeZone("Asia/Singapore"));
} catch (DatatypeConfigurationException | ParseException e) {
LOG.error("getGregorianCalendarFromDateString::"+
"Caught error while parsing date::"+e.getMessage());
}
return gregCal;
}
Java API 指的是IANA Language Subtag Registry(region下)查找国家代码。在 IANA 网站中,英国的区域代码是 GB。但是,使用 GB:
设置GregorianCalendar
对象
import java.util.*;
class MainClass{
public static void main (String[] args) {
GregorianCalendar date1 = new GregorianCalendar(Locale.GB);
int year = date1.get(GregorianCalendar.YEAR);
int weekday = date1.get(GregorianCalendar.DAY_OF_WEEK);
System.out.println(year);
System.out.println(weekday);
}
}
导致出现以下错误消息:
cannot find symbol
symbol: variable GB
location: class locale
请问我应该怎么做?
语言环境 class 中的常量是国家名称,而不是国家代码。例如,有 Locale.ITALY
,但没有 Locale.IT
。这就是为什么也没有 Locale.GB
.
您所指的代码是 ISO 3166 alpha-2 国家/地区代码。它们仅用作 Locale 构造函数中的参数。之后如何命名此对象取决于您。
尝试Locale.UK让你的代码编译。
其他答案正确。
java.time
这是您的代码的当前版本:
LocalDate today = LocalDate.now(ZoneId.of("Europe/London"));
int year = today.getYear();
DayOfWeek weekday = today.getDayOfWeek();
System.out.println(year);
System.out.println(weekday);
今天(6 月 17 日)的输出是
2018
SUNDAY
到目前为止,您甚至不需要语言环境(但时区很重要,当然,您可能还想针对特定语言环境设置日期格式)。
我们将区域设置传递给 GregorianCalendar
的原因(在过去我们使用 class)是因为它决定了周计划:一周的第一天是星期六、星期日或星期一取决于地区。今天,如果您需要针对特定语言环境的周计划,您应该使用 WeekFields
class 及其静态 of(Locale)
方法。
GregorianCalendar
class 早就过时了。设计的也很差,所以我建议你不要使用它。
在下面的函数中,我试图将 TimeZone "Asia/Singapore" 设置为以 "yyy-MM-dd" 格式发送的日期字符串,您甚至可以将 dateString 格式作为另一个参数传递,并将其设置为 SimpleDateFormat 对象,这是如何在 GregorianCalendar 中本地化时间的完美解决方案。
public static GregorianCalendar getGregorianCalendarFromDateString(String dateString) {
GregorianCalendar gregCal = null;
try {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
formatter.setTimeZone(TimeZone.getTimeZone("Asia/Singapore"));
Date date = formatter.parse(dateString);
gregCal = new GregorianCalendar();
gregCal.setTime(date);
gregCal.setTimeZone(TimeZone.getTimeZone("Asia/Singapore"));
} catch (DatatypeConfigurationException | ParseException e) {
LOG.error("getGregorianCalendarFromDateString::"+
"Caught error while parsing date::"+e.getMessage());
}
return gregCal;
}