2010-07-08 60 views
17

Tôi cần nhận chi tiết ngày, tháng, năm từ giá trị Date nhưng không được dùng nữa, cung cấp năm trên 2 chữ số và có vấn đề với Y2K (2008 cung cấp 108). Tài liệu java khuyến cáo sử dụng java.util.calendar nhưng nó không được hỗ trợ trong GWT.Nhận chi tiết ngày (ngày, tháng, năm) trong GWT

Tôi muốn tránh gửi tất cả thông tin qua lại giữa máy chủ và máy khách chỉ để xử lý các ngày.

Edit: Calendar có thể được hỗ trợ chức năng xử lý ngày cần được thực hiện trong GWT futur phiên bản: http://code.google.com/p/google-web-toolkit/issues/detail?id=603

Trả lời

19

Không sử dụng các phương pháp đó bị phản đối trên Lớp ngày trong GWT.

Nếu bạn không muốn sử dụng triển khai ngày của bên thứ ba cho GWT, Bạn sử dụng kết hợp DateTimeFormat cùng với thao tác chuỗi như giải pháp trong thời gian tới, cho đến khi GWT có hỗ trợ tốt hơn cho thao tác ngày.

For date - 
DateTimeFormat.getFormat("d-M-yyyy").format(new Date()).split("-")[0] 

For month - 
DateTimeFormat.getFormat("d-M-yyyy").format(new Date()).split("-")[1] 

For year - 
DateTimeFormat.getFormat("d-M-yyyy").format(new Date()).split("-")[2] 

Edit- Tương tự, tránh sử dụng ngày mới mâu thuẫn (yy, mm, dd) đã đến tùy thuộc vào trình duyệt và phạm vi ngày.

Tôi có sử dụng một DateUtil lớp đơn giản để tạo và phân tích đối tượng Date trong GWT, có thể sử dụng một số bạn -

(Cảnh báo: Rất thô, và làm việc cơ bản dở dang)

public class DateUtil 
{ 
    private static final String D_M_YYYY = "d-M-yyyy"; 
    private static final String DATE_SEPARATOR = "-"; 

    public static Date getDate(Integer dd, Integer mm, Integer yyyy) 
    { 
     if (dd == null || mm == null || yyyy == null) 
      return null; 

     Date retVal = null; 
     try 
     { 
      retVal = DateTimeFormat.getFormat(D_M_YYYY).parse(dd + DATE_SEPARATOR + mm + DATE_SEPARATOR + yyyy); 
     } 
     catch (Exception e) 
     { 
      retVal = null; 
     } 

     return retVal; 
    } 

    public static String getDayAsString(Date date) 
    { 
     return (date == null) ? null : DateTimeFormat.getFormat(D_M_YYYY).format(date).split(DATE_SEPARATOR)[0]; 
    } 

    public static String getMonthAsString(Date date) 
    { 
     return (date == null) ? null : DateTimeFormat.getFormat(D_M_YYYY).format(date).split(DATE_SEPARATOR)[1]; 
    } 

    public static String getYearAsString(Date date) 
    { 
     return (date == null) ? null : DateTimeFormat.getFormat(D_M_YYYY).format(date).split(DATE_SEPARATOR)[2]; 
    } 

    public static boolean isValidDate(Integer dd, Integer mm, Integer yyyy) 
    { 
     boolean isvalidDate = true; 

     try 
     { 
      String transformedInput = DateTimeFormat.getFormat(D_M_YYYY).format(getDate(dd, mm, yyyy)); 
      String originalInput = dd + DATE_SEPARATOR + mm + DATE_SEPARATOR + yyyy; 

      isvalidDate = transformedInput.equals(originalInput); 
     } 
     catch (Exception e) 
     { 
      isvalidDate = false; 
     } 

     return isvalidDate; 
    } 
} 
+0

Bạn nên giới thiệu triển khai ngày của bên thứ ba nào? – Jla

+0

Tôi không có số ngày phức tạp trong ứng dụng của mình, và do đó không quan tâm đến bất kỳ thư viện DateTime nào cho GWT. Tôi biết có một tiện ích GwtDateTime (http://code.google.com/p/gwt-examples/wiki/gwtDateTime), nhưng không thử nghiệm nó, không thể xác nhận cho nó. YMMV –

+0

Chúng không hoạt động trong các bài kiểm tra đơn vị: (trừ khi bạn mở rộng GWTTestCase chậm) –

2

Bạn có thể chỉ cần thêm 1.900-getYear() giá trị trả về

1

tôi đừng nghĩ rằng gwt sẽ hỗ trợ Lịch trong tương lai, có thể nó có thể hỗ trợ triển khai thao tác ngày khác. Vì vậy, vì đề xuất java về việc không sử dụng Date không hợp lệ trong Gwt và bạn không có bất kỳ tùy chọn nào khác mà không cần nhập thư viện của bên thứ ba, đúng cách là sử dụng Date và bỏ qua cảnh báo không dùng nữa.

+0

Có một vài trường hợp cạnh không thành công trong các getters không dùng nữa của Date. lỗi cho phương thức getDate() vào ngày, s ince sau đó ngừng sử dụng phương thức Date.Tôi đặc biệt khuyên bạn nên kiểm tra kỹ lưỡng phương thức ngày của mình cho phạm vi ngày dự kiến ​​trước khi triển khai trên sản xuất. –

24

Cách giải quyết được Ashwin trình bày và không phức tạp. Nhưng tôi khuyên bạn nên sử dụng các mẫu ngày thay vì tách:

For date - 
DateTimeFormat.getFormat("d").format(new Date()) 

For month - 
DateTimeFormat.getFormat("M").format(new Date()) 

For year - 
DateTimeFormat.getFormat("yyyy").format(new Date()) 
+1

Tôi cũng nghĩ như vậy. Tại sao hai lần công việc? –

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