2010-09-19 39 views
27

Làm thế nào để có được ngày trước một tuần kể từ bây giờ trong android ở định dạng này:ngày get Android trước 7 ngày (một tuần)

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

cũ: bây giờ 2010-09-19 HH:mm:ss, trước một tuần 2010-09-12 HH:mm:ss

Cảm ơn

Trả lời

78

Phân tích ngày:

Date myDate = dateFormat.parse(dateString); 

Và sau đó, hoặc tìm ra bao nhiêu millis econds bạn cần phải trừ:

Date newDate = new Date(myDate.getTime() - 604800000L); // 7 * 24 * 60 * 60 * 1000 

Hoặc sử dụng API được cung cấp bởi lớp java.util.Calendar:

Calendar calendar = Calendar.getInstance(); 
calendar.setTime(myDate); 
calendar.add(Calendar.DAY_OF_YEAR, -7); 
Date newDate = calendar.getTime(); 

Sau đó, nếu bạn cần, chuyển đổi nó trở lại một String:

String date = dateFormat.format(newDate); 
+0

Tôi nghĩ bạn nên sử dụng Calendar.roll() thay vì Calendar.add() nếu bạn muốn xử lý quyền thay đổi tháng/năm. Ví dụ của bạn có thể sai giữa ngày 1 và 6 tháng 1. –

+6

Tôi nghĩ điều ngược lại là đúng: roll() không xử lý các thay đổi tháng/năm khi được gọi vào ngày tháng, trong khi add() thực hiện. –

+1

Ok, xấu của tôi! ;-) –

1

Tôi có thể thấy hai cách:

  1. Sử dụng một GregorianCalendar:

    Calendar someDate = GregorianCalendar.getInstance(); 
    someDate.add(Calendar.DAY_OF_YEAR, -7); 
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    String formattedDate = dateFormat.format(someDate); 
    
  2. Sử dụng một android.text.format.Time:

    long yourDateMillis = System.currentTimeMillis() - (7 * 24 * 60 * 60 * 1000); 
    Time yourDate = new Time(); 
    yourDate.set(yourDateMillis); 
    String formattedDate = yourDate.format("%Y-%m-%d %H:%M:%S"); 
    

Giải pháp 1 là "chính thức" java bằng cách nào, nhưng sử dụng một GregorianCalendar có thể có vấn đề hiệu suất nghiêm trọng nên các kỹ sư Android đã đã thêm đối tượng android.text.format.Time để sửa lỗi này.

+0

Phương pháp cuộn không ảnh hưởng đến bất kỳ trường nào khác, vì vậy bạn sẽ luôn bị kẹt trong cùng một tháng, ngay cả khi bạn cố gắng quay lại 7 ngày kể từ ngày đầu tiên của tháng. –

+1

Bạn nói đúng, tôi đã sửa lại ví dụ. Dù sao, quan điểm của tôi đã được nhiều hơn về việc sử dụng android.text.format.Time được ưa thích nếu bạn đang cập nhật một ngày trong một mục ListView. Sử dụng GregorianCalendar có thể ngăn danh sách của bạn di chuyển rất nhanh. –

+0

Thankyou, lưu ý các lập trình viên đồng nghiệp ví dụ đầu tiên ở đây nên định dạng (someDate.getTime()) thay vì chỉ someDate –

13

Tôi đã tạo ra chức năng của riêng tôi mà có thể hữu ích để giúp Tiếp theo/ngày trước từ

ngày hiện tại:

/** 
* Pass your date format and no of days for minus from current 
* If you want to get previous date then pass days with minus sign 
* else you can pass as it is for next date 
* @param dateFormat 
* @param days 
* @return Calculated Date 
*/ 
public static String getCalculatedDate(String dateFormat, int days) { 
    Calendar cal = Calendar.getInstance(); 
    SimpleDateFormat s = new SimpleDateFormat(dateFormat); 
    cal.add(Calendar.DAY_OF_YEAR, days); 
    return s.format(new Date(cal.getTimeInMillis())); 
} 

Ví dụ:

getCalculatedDate("dd-MM-yyyy", -10); // It will gives you date before 10 days from current date 

getCalculatedDate("dd-MM-yyyy", 10); // It will gives you date after 10 days from current date 

và nếu bạn muốn nhận Ngày được Tính toán với số điện thoại Ngày của riêng bạn:

public static String getCalculatedDate(String date, String dateFormat, int days) { 
    Calendar cal = Calendar.getInstance(); 
    SimpleDateFormat s = new SimpleDateFormat(dateFormat); 
    cal.add(Calendar.DAY_OF_YEAR, days); 
    try { 
     return s.format(new Date(s.parse(date).getTime())); 
    } catch (ParseException e) { 
     // TODO Auto-generated catch block 
     Log.e("TAG", "Error in Parsing Date : " + e.getMessage()); 
    } 
    return null; 
} 

Ví dụ với Đi qua ngày riêng:

getCalculatedDate("01-01-2015", "dd-MM-yyyy", -10); // It will gives you date before 10 days from given date 

getCalculatedDate("01-01-2015", "dd-MM-yyyy", 10); // It will gives you date after 10 days from given date 
+1

Tốt hơn được chấp nhận, cảm ơn! –

4

tl; dr

LocalDate 
    .now(ZoneId.of("Pacific/Auckland"))   // Get the date-only value for the current moment in a specified time zone. 
    .minusWeeks(1)         // Go back in time one week. 
    .atStartOfDay(ZoneId.of("Pacific/Auckland")) // Determine the first moment of the day for that date in the specified time zone. 
    .format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) // Generate a string in standard ISO 8601 format. 
    .replace("T" , " ")        // Replace the standard "T" separating date portion from time-of-day portion with a SPACE character. 

java.time

Cách tiếp cận hiện đại sử dụng các lớp java.time.

Lớp LocalDate đại diện cho giá trị chỉ có ngày 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.forID("America/Montreal") ; 
LocalDate now = LocalDate.now (z) ; 

Thực hiện một số phép tính sử dụng phương pháp minus…plus….

LocalDate weekAgo = now.minusWeeks(1); 

Hãy để java.time xác định thời điểm đầu tiên trong ngày cho múi giờ mong muốn của bạn. Đừng cho rằng ngày bắt đầu tại 00:00:00. Bất thường như Daylight Saving Time có nghĩa là ngày có thể bắt đầu vào một thời điểm khác như 01:00:00.

ZonedDateTime weekAgoStart = weekAgo.atStartOfDay(z) ; 

Tạo chuỗi đại diện cho đối tượng ZonedDateTime sử dụng đối tượng DateTimeFormatter. Tìm kiếm Stack Overflow cho nhiều cuộc thảo luận hơn về lớp này.

DateTimeFormatter f = DateTimeFormatter.ISO_LOCAL_DATE_TIME ; 
String output = weekAgoStart.format(f) ; 

Định dạng chuẩn gần với những gì bạn muốn, nhưng có một số T ở giữa vị trí bạn muốn một không gian. Vì vậy, thay thế SPACE cho T.

output = output.replace("T" , " ") ; 

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?

Joda thời gian

Cập nhật: Dự án Joda-Thời gian bây giờ là trong chế độ bảo trì. Nhóm này khuyên bạn nên di trú sang các lớp java.time.

Sử dụng thư viện Joda-Time giúp công việc ngày giờ dễ dàng hơn nhiều.

Lưu ý việc sử dụng múi giờ. Nếu bỏ qua, bạn đang làm việc trong UTC hoặc múi giờ mặc định hiện tại của JVM.

DateTime now = DateTime.now (DateTimeZone.forID("America/Montreal")) ; 
DateTime weekAgo = now.minusWeeks(1); 
DateTime weekAgoStart = weekAgo.withTimeAtStartOfDay(); 
Các vấn đề liên quan