从GregorianCalendar获取星期几

21

我有一个日期,需要知道这一天是星期几,因此我使用了GregorianCalendar对象,但返回的一些日期是不正确的。

GregorianCalendar calendar = new GregorianCalendar(year, month, day);
int i = calendar.get(Calendar.DAY_OF_WEEK);

我做错了什么?

谢谢!

编辑解决方案:

mont--;
GregorianCalendar calendar = new GregorianCalendar(year, month, day);
int i = calendar.get(Calendar.DAY_OF_WEEK);

    if(i == 2){
        dayOfTheWeek = "Mon";           
    } else if (i==3){
        dayOfTheWeek = "Tue";
    } else if (i==4){
        dayOfTheWeek = "Wed";
    } else if (i==5){
        dayOfTheWeek = "Thu";
    } else if (i==6){
        dayOfTheWeek = "Fri";
    } else if (i==7){
        dayOfTheWeek = "Sat";
    } else if (i==1){
        dayOfTheWeek = "Sun";
    }

它是否返回了默认值(可能是0或1),而不是您期望的值?请向我们展示您的代码和期望的结果。 - Dave
6
当你设置月份时,值应该是(实际月份-1)。例如)三月->2,一月->0,十二月->11。你是否设置正确的月份值? - kingori
kingori谢谢!那就是问题的所在 :) - MataMix
我必须说这不是本地化证明。而且,今天是星期五,而不是炸鱼日。 - Boude
1
顺便提一下,对于非Android平台,在Java 8及更高版本中使用java.time类,例如DayOfWeek枚举:DayOfWeek.TUESDAY.getDisplayName(TextStyle.FULL, Locale.CANADA_FRENCH)); - Basil Bourque
3个回答

15
TimeZone timezone = TimeZone.getDefault();
Calendar calendar = new GregorianCalendar(timezone);
calendar.set(year, month, day, hour, minute, second);

String monthName=calendar.getDisplayName(Calendar.MONTH, Calendar.SHORT, Locale.getDefault());//Locale.US);
String dayName=calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.SHORT, Locale.getDefault());//Locale.US);

calendar.set(2015, Calendar.JANUARY, 8, 0, 0, 0); 将日期设置为2015年1月8日。 - Lou Morda
请注意,像java.util.Datejava.util.Calendarjava.text.SimpleDateFormat这样的旧日期时间类现在已经成为遗留系统,被内置于Java 8及更高版本中的java.time类所取代。请参阅Oracle的教程 - Basil Bourque

3

Joda-Time

我使用Joda-Time库来处理所有与日期/时间相关的操作。Joda会考虑你的语言环境并相应地返回结果:

import org.joda.time.DateTime;
DateTime date = new DateTime(year, month, day, 0, 0, 0);

或者

DateTime date = DateTime().now();

星期几(整数):

date.getDayOfWeek();

使用 toString()DateTimeFormat 选项获取星期几(短字符串):

date.toString("EE");

FYI,Joda-Time 项目现已进入维护模式,团队建议迁移到java.time类。请参阅Oracle的教程 - Basil Bourque

0

简而言之

myGregCal                  // `GregorianCalendar` is a legacy class, supplanted by the modern `java.time.ZonedDateTime` class.
    .toZonedDateTime()     // Convert to `ZonedDateTime`.
    .getDayOfWeek().       // Extract a `DayOfWeek` enum object, one of seven pre-defined objects, one for each day of the week.
    .getDisplayName(       // Automatically localize, generating a `String` to represent the name of the day of the week.
        TextStyle.SHORT ,  // Specify how long or abbreviated.
        Locale.US          // Locale determines the human language and cultural norms used in localization.
    )                      // Returns a `String` object.

Mon

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )              // Get current date for people in a certain region, without time-of-day and without time zone.
.getDayOfWeek()                                           // Extract a `DayOfWeek` enum object.
.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH )  // Generate a string representing that day-of-week, localized using the human language and cultural norms of a particular locale.

lundi

java.time

通过调用添加到旧类中的新方法,将麻烦的旧遗留{{link1:java.util.GregorianCalendar}}对象转换为现代的java.time对象。

ZonedDateTime zdt = myGregCal.toZonedDateTime();

获取该时区中该时刻的DayOfWeek枚举对象。

DayOfWeek dow = zdt.getDayOfWeek();

dow.toString(): 星期三

将这些DayOfWeek对象传递到您的代码中,而不是传递像1-7这样的整数或像"MON"这样的字符串。通过使用枚举对象,您使您的代码更加自我记录,提供类型安全性并确保一系列有效值。

为了向用户呈现,请要求DayOfWeek对象将一周中某天的名称翻译成在Locale中定义的人类语言。

String output = 
    dow.getDisplayName( 
        TextStyle.FULL_STANDALONE , 
        Locale.CANADA_FRENCH 
    )
;

mercredi


关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了老旧的传统日期时间类,如{{link3:java.util.Date}}、{{link4:Calendar}}和{{link5:SimpleDateFormat}}。

Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。

想要了解更多,请参阅 Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是 JSR 310

您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。无需字符串,也不需要 java.sql.* 类。

如何获取 java.time 类?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接