2013-05-07 42 views
5

tôi có một chương trình nhỏ mà sẽ hiển thị tuần hiện tại kể từ ngày ngày nay, như thế này:Java: Nhận số tuần từ bất kỳ ngày nào?

GregorianCalendar gc = new GregorianCalendar(); 
    int day = 0; 
    gc.add(Calendar.DATE, day); 

Và sau đó một JLabel có hiển thị số tuần:

JLabel week = new JLabel("Week "+gc.get(Calendar.WEEK_OF_YEAR)); 

Vì vậy, ngay bây giờ tôi muốn để có một JTextField nơi bạn có thể nhập một ngày và JLabel sẽ cập nhật với số tuần của ngày đó. Tôi thực sự không chắc chắn làm thế nào để làm điều này như tôi là khá mới với Java. Tôi có cần lưu đầu vào dưới dạng Chuỗi không? Một số nguyên? Và nó sẽ là định dạng nào (yyyyMMdd etc)? Nếu có ai có thể giúp tôi, tôi sẽ đánh giá cao nó!

+0

Bạn cần phải phân tích các đầu vào với một định dạng cụ thể. Điều này có thể giúp: http://stackoverflow.com/questions/3386520/parse-date-from-string-in-this-format-dd-mm-yyyy-to-dd-mm-yyyy –

+0

FYI, ngày cũ phiền hà các lớp thời gian như ['java.util.Date'] (https://docs.oracle.com/javase/8/docs/api/java/util/Date.html), [' java.util.Calendar' ] (https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html) và 'java.text.SimpleTextFormat' hiện là [legacy] (https: //en.wikipedia) .org/wiki/Legacy_system), được thay thế bởi các lớp [java.time] (https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html). Xem [Hướng dẫn của Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

Trả lời

16

Tôi có cần lưu đầu vào dưới dạng chuỗi không? Một số nguyên?

Khi sử dụng một JTextField, đầu vào bạn nhận được từ người dùng là một String, kể từ ngày có thể chứa các ký tự như . hoặc -, tùy thuộc vào định dạng ngày mà bạn chọn. Tất nhiên, bạn cũng có thể sử dụng một số phương thức nhập phức tạp hơn, trong đó trường nhập đã xác thực định dạng ngày và trả về các giá trị riêng biệt cho ngày, tháng và năm, nhưng việc sử dụng JTextField là tất nhiên dễ dàng hơn để bắt đầu.

Và định dạng sẽ phải là gì (yyyyMMdd etc)?

Điều này tùy thuộc vào yêu cầu của bạn. Bạn có thể sử dụng lớp SimpleDateFormat để phân tích bất kỳ định dạng ngày:

String input = "20130507"; 
String format = "yyyyMMdd"; 

SimpleDateFormat df = new SimpleDateFormat(format); 
Date date = df.parse(input); 

Calendar cal = Calendar.getInstance(); 
cal.setTime(date); 
int week = cal.get(Calendar.WEEK_OF_YEAR); 

Nhưng nhiều khả năng bạn muốn sử dụng định dạng ngày riêng cho ngôn ngữ của bạn:

import java.text.DateFormat; 

DateFormat defaultFormat = DateFormat.getDateInstance(); 
Date date = defaultFormat.parse(input); 

Để cung cấp cho người dùng một gợi ý về định dạng để sử dụng, bạn cần phải cast DateFormat đến một SimpleDateFormat để có được những chuỗi mẫu:

if (defaultFormat instanceof SimpleDateFormat) { 
    SimpleDateFormat sdf = (SimpleDateFormat)defaultFormat; 
    System.out.println("Use date format like: " + sdf.toPattern()); 
} 

các bình luận bằng @adenoyelle trên nhắc nhở tôi: Viết các bài kiểm tra đơn vị cho mã phân tích ngày của bạn.

+1

Nhiều năm sau, Câu trả lời này đã lỗi thời với những cải tiến đối với Java. Các lớp ngày tháng phiền hà cũ như ['java.util.Date'] (https://docs.oracle.com/javase/8/docs/api/java/util/Date.html), [' java. util.Calendar'] (https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html) và 'java.text.SimpleTextFormat' hiện là [legacy] (https://en.wikipedia.org/wiki/Legacy_system), được thay thế bởi các lớp [java.time] (https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) . Xem [Hướng dẫn của Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

1

Bạn có thể sử dụng điều đó, nhưng bạn phải phân tích giá trị ngày thành định dạng ngày thích hợp bằng cách sử dụng SimpleDateFormatter trong số java API. Bạn có thể chỉ định bất kỳ định dạng nào bạn muốn. Sau đó bạn có thể thực hiện thao tác để có được tuần trong năm.

3

Bạn có thể lưu ngày làm Chuỗi và người dùng có thể nhập ngày đó theo bất kỳ định dạng nào bạn chỉ định. Bạn chỉ cần sử dụng đối tượng DateFormat để diễn giải ngày mà họ nhập. Ví dụ: xem top answer trên Convert String to Calendar Object in Java.

Calendar cal = Calendar.getInstance(); 
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy"); 
cal.setTime(sdf.parse("Mon Mar 14 16:02:37 GMT 2011")); 

Để đọc ngày từ một JTextField, bạn có thể thay thế điều đó với một cái gì đó như:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // or any other date format 
cal.setTime(sdf.parse(dateTextField.getText())); 

Sau đó, bạn chỉ cần đọc số tuần từ cal trong cùng một cách bạn thể hiện trong câu hỏi . (Đây là một ví dụ đơn giản. Bạn sẽ cần phải xử lý các tiềm năng ParseException ném theo phương pháp DateFormatparse.)

0
public static int getWeek() { 
     return Calendar.getInstance().get(Calendar.WEEK_OF_YEAR); 
    } 

Hoạt động tốt và trở lại tuần trong thời gian thực hiện

5

Java 1.8 cung cấp cho bạn với một số mới lớp trong gói java.time:

import java.time.Instant; 
import java.time.ZoneId; 
import java.time.ZonedDateTime; 
import java.time.temporal.IsoFields; 

ZonedDateTime now = ZonedDateTime.ofInstant(Instant.now(), ZoneId.systemDefault()); 
System.out.printf("Week %d%n", now.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR)); 

Hầu hết lịch di sản có thể dễ dàng được chuyển đổi sang java.time.ZonedDateTime/java.time.Instant bằng các phương pháp tương tác, đặc biệt là của bạn trường hợp GregorianCalendar.toZonedDateTime().

3

tl; dr

YearWeek.of(LocalDate.parse("2017-01-23")) 
     .getWeek() // and .getYear() 

ISO 8601 tuần chuẩn

Nếu bạn muốn chuẩn ISO 8601 week, chứ không phải là một định nghĩa cục bộ của một tuần, sử dụng lớp YearWeek tìm thấy trong các dự án ThreeTen-Extra có thêm chức năng đến các lớp java.time được tích hợp vào Java 8 trở lên.

ISO-8601 xác định tuần như thường bắt đầu từ thứ Hai. Tuần đầu tiên là tuần có Thứ Năm đầu tiên của năm dương lịch. Như vậy, tuần dựa trên năm được sử dụng trong lớp này không phù hợp với năm dương lịch.

Đầu tiên, nhận ngày hôm nay. 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 ở định dạng 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); 

Hoặc để người dùng chỉ định ngày bằng cách nhập chuỗi. Đầu vào chuỗi phân tích cú pháp của một ngày được bao gồm trong nhiều các câu hỏi và câu trả lời khác. Đơn giản nhất là để người dùng sử dụng định dạng chuẩn ISO 8601, YYYY-MM-DD chẳng hạn như 2017-01-23.

LocalDate ld = LocalDate.parse("2017-01-23") ; 

Đối với các định dạng khác, hãy chỉ định DateTimeFormatter để phân tích cú pháp. Tìm kiếm Stack Overflow cho nhiều ví dụ về việc sử dụng lớp đó.

DateTimeFormatter f = DateTimeFormatter.ofPattern("d/M/uuuu" , Locale.US) ; 
LocalDate ld = LocalDate.parse("1/23/2017" , f) ; 

Lấy YearWeek.

YearWeek yw = YearWeek.of(ld) ; 

Để tạo chuỗi, hãy xem xét sử dụng standard ISO 8601 format for year-week, yyyy-Www chẳng hạn như 2017-W45. Hoặc bạn có thể trích xuất từng số.

  • YearWeek::getWeek - Lấy trường hàng tuần theo năm.
  • YearWeek::getYear - Nhận trường dựa trên tuần.

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.

0

này làm việc cho tôi

public void sortListItems(List<PostModel> list) { 
    Collections.sort(list, new Comparator<PostModel>() { 
     DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
     @Override 
     public int compare(PostModel o1, PostModel o2) { 
      int ret = 0; 
      try { 
       ret = dateFormat.parse(o1.getDate()).compareTo(dateFormat.parse(o2.getDate())); 
       return ret; 
      } catch (ParseException e) { 
       e.printStackTrace(); 
      } 

      return ret; 
     } 
    }); 
} 
Các vấn đề liên quan