【问题标题】:Java - Get array of name of day for current weekJava - 获取当前星期的日期名称数组
【发布时间】:2013-02-25 20:50:27
【问题描述】:

我正在寻找的是在java中创建一个星期几的数组,从昨天开始,最多六天

 String daysWeek[] = { "Yesterday", "Today", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};

我想以昨天和今天返回的数组的前两个元素。

起初,使用

这似乎是一件容易的事
currentDay = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);

String daysList[] = {"Sunday", "Monday", "Tuesday", "Wednesday",
            "Thursday", "Friday", "Saturday"};

String daysWeek[] = {"Yesterday", "Today", daysList[currentDay], daysList[currentDay+1], ...};

daysList[currentDay] 上面的注释明天将返回,因为 daysList 的数组从 0 开始,即如果 currentDay = 3 表示今天是星期二,那么这将是 daysList[2]

但我的问题在于,如果 currentDay 是 7,这意味着今天是星期六,那么 currentDay+1 即明天将是数组中不存在的第八个元素。

如果今天是星期三或更晚,那么我可以循环使用我的数字吗?如果今天是周三或之后一次 currentDay + x > 7,请将 currentDay 设置回 1?

这一切都发生在一个称为getDaysList(currentDay) 的方法中,它返回daysWeek[] 数组。

【问题讨论】:

  • WChargin 的答案是对的。我只是想知道你为什么要这样做。使用数组通常是糟糕的面向对象设计的标志。也许您的代码可以重构。如果您能解释将工作日存储在数组中的目标,也许我们可以找到更好的解决方案(或了解您的解决方案是最好的)

标签: java arrays loops calendar dayofweek


【解决方案1】:

这里对您有用的一个函数是 (%) 运算符。

基本上,模运算符所做的是取除法的余数,这正是您想要的。 (还记得四年级时“9 / 2”不是 4.5,而是 4 余数 1 吗?这就是余数部分。)

所以不要有:

days[currentDay + x]

用途:

days[(currentDay + x) % 7]

模运算符返回值的快速示例:

 0 % 7 = 0   (0 / 7 = 0 R0)
 1 % 7 = 1   (1 / 7 = 0 R1)
 6 % 7 = 6   (6 / 7 = 0 R6)
 7 % 7 = 0   (7 / 7 = 1 R0)
 8 % 7 = 1   (8 / 7 = 1 R1)
15 % 7 = 1   (15 / 7 = 2 R1)

【讨论】:

  • 非常感谢,我忘记了这个符号。
【解决方案2】:

tl;博士

LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )
         .plusDays( 5 )
         .getDayOfWeek()
         .getDisplayName( TextStyle.FULL , Locale.US )

详情

让您忘记与星期几相关的数组索引的想法。

此外,通常最好使用modern collection object 来收集您的对象,而不是仅仅使用一个数组。

另外,避免麻烦的Calendar 类。现在被java.time 类所取代。

首先获取当前日期。 LocalDate 类表示没有时间和时区的仅日期值。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。例如,Paris France 中午夜后几分钟是新的一天,而 Montréal Québec 中仍然是“昨天”。

continent/region 的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用 3-4 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

我们知道昨天的结果是yesterday,所以不需要计算那个日期。如果您确实需要日期,请致电LocalDate::minusDays

我们可以通过提取DayOfWeek 枚举对象来询问每个LocalDate 的日期名称。 DayOfWeek 知道您可以通过 Locale 对象指定的 its own name in any human language。因此,您无需跟踪模板日期字符串数组。提示:在 OOP 中,尝试考虑 (a) 让对象聪明地照顾自己,或 (b) 借助辅助对象,而不是使用基本数组自己完成所有工作。

List<String> dayNames = new ArrayList<>( 7 ) ;  // Initialize to seven days of a week.
dayNames.add( "yesterday" ) ;
dayNames.add( "today" ) ;
for( int i = 1 ; i <= 5 ; i ++ ) {
    LocalDate ld = today.plusDays( i ) ;
    String dayName = ld.getDayOfWeek().getDisplayName( TextStyle.FULL , Locale.US ) ;
    dayNames.add( dayName ) ;  // Add each of the five days remaining in a week.
}

试试这个code live in IdeOne.com

[昨天、今天、周二、周三、周四、周五、周六]


关于java.time

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

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

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

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    【解决方案3】:

    您可以使用余数运算符 (%):

    6 % 7 == 6
    7 % 7 == 0
    8 % 7 == 1
    

    【讨论】:

      【解决方案4】:
      import java.text.SimpleDateFormat;
      import java.util.*;
      class Date {</p><br>
          public static void main(String args[]) { </p><br>
          // Monday 01/27/2019 15:07:53 AM
          System.out.println("Current Day: "+new SimpleDateFormat("EEEE MM-dd-yyyy HH:mm:ss a").format(Calendar.getInstance().getTime()) );
         }
      }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-07
      • 2011-01-26
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      相关资源
      最近更新 更多