2013-03-10 63 views
6

我所寻求的是建立在Java中的星期几的阵列,从昨天开始,上六天时间,这样的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]的说明,将在0,即如果currentDay = 3它说今天是星期二,那么这将是daysList[2]回到明天自daysList开始的数组。

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

有没有什么我可以循环我的号码,如果今天是星期三或以后,然后一次currentDay + x > 7,请设置currentDay回到1?

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

+1

WChargin的答案是正确的。我只想知道你为什么想这样做。使用数组通常是不良面向对象设计的标志。也许你的代码可能被重构。如果你想解释你的目标是将数据存储在数组中,也许我们可以找到一个更好的解决方案(或者理解你的解决方案是最好的) – Martin 2013-03-10 18:17:39

回答

7

这里使用的函数是%)运算符。

基本上,模运算符所做的是采取余下的部门,这正是你想要的。 (记住回到第四级时 “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) 
+0

非常感谢,我忘记了这个符号。 – ChrisAF 2013-03-10 18:32:29

1

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

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

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/Casablanca,或Pacific/Auckland。切勿使用3-4字母缩写,如ESTIST,因为它们是而不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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

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

我们可以通过提取一个DayOfWeek枚举对象来询问每个LocalDate的当天的名称。那DayOfWeek知道its own name in any human language,你可以通过一个Locale对象指定。因此,您无需跟踪一组模板名称字符串。提示:在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.Date,Calendar,& SimpleDateFormat

Joda-Time项目现在位于maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310

从何处获取java.time类?

ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval,YearWeek,YearQuartermore