【问题标题】:Get day of the week from GregorianCalendar从 GregorianCalendar 获取星期几
【发布时间】:2011-09-23 03:25:51
【问题描述】:

我有一个日期,我需要知道星期几,所以我使用了一个 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)而不是您期望的值?向我们展示您拥有什么以及您想要什么。
  • 当你设置月份时,值应该是(真正的月份 - 1)。例如)3 月 -> 1 月 2 日 -> 12 月 0 日 -> 11。您是否设置了正确的月份值?
  • kingori 谢谢!这就是问题所在:)
  • 我不得不说这不是语言环境证明。另外,今天是星期五,而不是星期五。
  • 顺便说一下,对于非 Android,在 Java 8 及更高版本中使用 java.time 类,例如 DayOfWeek enum: DayOfWeek.TUESDAY.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) );

标签: android date calendar gregorian-calendar


【解决方案1】:
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);

【讨论】:

【解决方案2】:

乔达时间

我使用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");

【讨论】:

【解决方案3】:

tl;博士

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.

星期一

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.

隆迪

java.time

通过调用添加到旧类的新方法,将麻烦的旧旧 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 
    )
;

默契


关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

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

从哪里获得 java.time 类?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多