2013-03-10 27 views
6

Những gì tôi đang tìm kiếm là để tạo ra một mảng của các ngày trong tuần trong java, bắt đầu từ ngày hôm qua và đi lên đến sáu ngày thời gian như vậyJava - Nhận loạt các tên trong ngày để tuần hiện tại

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

Hai thành phần đầu tiên của mảng mà tôi muốn trả về là Hôm qua và Hôm nay.

Lúc đầu này có vẻ giống như một nhiệm vụ dễ dàng bằng cách sử dụng

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], ...}; 

Lưu ý về trên daysList[currentDay] sẽ trở lại vào ngày mai từ mảng daysList bắt đầu từ 0 tức là nếu currentDay = 3 mà nói hôm nay là thứ ba thì đây sẽ là daysList[2] .

Nhưng vấn đề của tôi nằm ở chỗ nếu currentDay là 7 hàm ý ngày hôm nay là thứ Bảy thì currentDay+1 ngày mai sẽ là phần tử thứ tám của mảng không tồn tại.

Có bất kỳ điều gì trong tôi có thể lặp vòng số của mình rằng nếu hôm nay là thứ Tư hoặc sau đó sau đó một lần currentDay + x > 7, hãy đặt currentDay quay lại 1?

Tất cả điều này diễn ra theo một phương pháp được gọi là getDaysList(currentDay) trả về mảng daysWeek[].

+1

Câu trả lời của WChargin là đúng. Tôi chỉ muốn biết tại sao bạn muốn làm điều đó. Sử dụng mảng thường là một dấu hiệu của thiết kế hướng đối tượng xấu. Có lẽ mã của bạn có thể được tái cấu trúc. Nếu bạn sẽ giải thích mục tiêu của bạn để lưu trữ các ngày trong một mảng có lẽ chúng ta có thể tìm ra giải pháp tốt hơn (hoặc hiểu rằng giải pháp của bạn là tốt nhất) – Martin

Trả lời

7

Chức năng sử dụng cho bạn ở đây là nhà điều hành modulo (%).

Về cơ bản, điều mà toán tử modulo thực hiện là lấy phần còn lại của bộ phận, chính xác là những gì bạn muốn. (Hãy nhớ lại trong lớp thứ tư khi "9/2" không phải là 4.5, nhưng 4 còn lại 1 Đây là phần còn lại?.)

Vì vậy, thay vì phải:

days[currentDay + x] 

Sử dụng:

days[(currentDay + x) % 7] 

dụ vắn tắt về giá trị được trả về bởi các nhà điều hành modulo:

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

Cảm ơn rất nhiều, tôi quên mất ký hiệu này. – ChrisAF

1

Bạn có thể sử dụng toán tử còn lại (%):

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

tl; dr

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

Chi tiết

Nhận tâm trí của bạn từ bỏ ý định chỉ số mảng liên quan đến ngày trong tuần.

Ngoài ra, thường tốt hơn là sử dụng một số modern collection object để thu thập đối tượng của bạn thay vì chỉ một mảng.

Ngoài ra, hãy tránh lớp phiền hà Calendar. Bây giờ được thay thế bởi các lớp học java.time.

Đầu tiên có ngày hiện tại. Lớp LocalDate đại diện cho giá trị chỉ ngày mà không có thời gian trong ngày và không có múi giờ.

Múi giờ rất quan trọng trong việc xác định ngày. Đối với bất kỳ thời điểm cụ thể nào, ngày thay đổi trên toàn cầu theo múi giờ. Ví dụ: một vài phút sau nửa đêm ở Paris France là một ngày mới trong khi vẫn “ngày hôm qua” trong Montréal Québec.

Chỉ định proper time zone name trong định dạng của continent/region, chẳng hạn như America/Montreal, Africa/Casablanca, hoặc Pacific/Auckland. Không bao giờ sử dụng từ viết tắt 3-4 ký tự như EST hoặc IST vì chúng là không múi giờ thực, không được chuẩn hóa và thậm chí không độc đáo (!).

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

Chúng tôi biết kết quả cho ngày hôm qua là yesterday vì vậy không cần tính ngày đó. Nếu bạn cần ngày, hãy gọi LocalDate::minusDays.

Chúng tôi có thể yêu cầu mỗi LocalDate cho tên của ngày bằng cách trích xuất đối tượng enum DayOfWeek. Điều đó DayOfWeek biết its own name in any human language mà bạn có thể chỉ định thông qua đối tượng Locale. Vì vậy, bạn không cần phải theo dõi một mảng các chuỗi tên mẫu trong ngày. Mẹo: Trong OOP, hãy cố gắng nghĩ (a) cho phép đối tượng thông minh, hoặc (b) tranh thủ sự trợ giúp của đối tượng trợ giúp, thay vì sử dụng mảng cơ bản để tự làm tất cả công việc.

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. 
} 

Hãy thử điều này code live in IdeOne.com.

[ngày hôm qua, hôm nay, Thứ Ba, Thứ Tư, Thứ Năm, Thứ Sáu, Thứ Bảy]


Về java.time

Khung java.time được xây dựng vào Java 8 và sau đó. Các lớp này thay thế các lớp học ngày giờ legacy phiền hà cũ như java.util.Date, Calendar, & SimpleDateFormat.

Dự án Joda-Time, hiện đang ở maintenance mode, khuyên di chuyển đến các lớp java.time.

Để tìm hiểu thêm, hãy xem Oracle Tutorial. Và tìm kiếm Stack Overflow cho nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310.

Nơi lấy các lớp java.time?

Dự án mở rộng ThreeTen-Extra java.time với các lớp bổ sung. Dự án này là một nền tảng chứng minh cho những bổ sung có thể có trong tương lai vào java.time. Bạn có thể tìm thấy một số lớp học hữu ích tại đây như Interval, YearWeek, YearQuartermore.

Các vấn đề liên quan