Java 捆绑的 java.util.Date 和 Calendar 类是出了名的麻烦。避开他们。
问题和其他答案都忽略了时区的关键问题。如果您忽略指定时区,您将获得 JVM 的默认值。这意味着当在不同的计算机上运行或更改 JVM 设置时,您的代码的结果会有所不同,这可能不是您想要的。
乔达时间
这个第三方开源库Joda-Time 是一个流行的替代品。
指定时区而不是依赖默认值。
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
java.util.Locale locale = java.util.Locale.FRANCE;
DateTime now = new DateTime( timeZone );
int dayOfMonth = now.getDayOfMonth();
int monthOfYear = now.getMonthOfYear(); // 1-based counting, January = 1, unlike java.util.Calendar.
String nowAsString = DateTimeFormat.forStyle( "F-" ).withLocale( locale ).print( now );
转储到控制台...
System.out.println( "now: " + now );
System.out.println( "dayOfMonth: " + dayOfMonth );
System.out.println( "monthOfYear: " + monthOfYear );
System.out.println( "nowAsString: " + nowAsString );
运行时……
now: 2014-02-21T05:51:18.688+01:00
dayOfMonth: 21
monthOfYear: 2
nowAsString: vendredi 21 février 2014
java.time.*
Java 8 带来了一个新的java.time.8 package 来取代旧的 j.u.Date/Calendar 类。这个新包的灵感来自 Joda-Time(但经过重新架构)并由 JSR 310 定义。
ZoneId zoneId = ZoneId.of( "Europe/Paris" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
int dayOfMonth = now.getDayOfMonth();
int monthOfYear = now.getMonthValue(); // 1-based counting, January = 1, unlike java.util.Calendar.
String nowAsString = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( Locale.FRANCE ).format( now );
转储到控制台...
System.out.println( "now: " + now );
System.out.println( "dayOfMonth: " + dayOfMonth );
System.out.println( "monthOfYear: " + monthOfYear );
System.out.println( "nowAsString: " + nowAsString );
运行时……
now: 2014-02-21T06:05:48.833+01:00[Europe/Paris]
dayOfMonth: 21
monthOfYear: 2
nowAsString: vendredi 21 février 2014