2010-11-09 6 views
38

Tôi chưa từng sử dụng JodaTime trước đây, nhưng trả lời câu hỏi này, How to get ordinal Weekdays in a Month.JodaTime tương đương với DateUtils.truncate()

Tôi đã thử nó và đã đưa ra với mã xấu xí này để bỏ đặt tất cả các lĩnh vực dưới đây trong ngày:

DateTime startOfMonth = 
    input.withDayOfMonth(1) 
     .withHourOfDay(0)  // there 
     .withMinuteOfHour(0) // has got to 
     .withSecondOfMinute(0) // be a shorter way 
     .withMillisOfSecond(0); // to do this 

Trường hợp Commons/Lang tương đương sử dụng DateUtils sẽ

Date startOfMonth = DateUtils.truncate(input, Calendar.MONTH); 

thành ngữ ưa thích để làm điều đó là gì trong JodaTime?

Trả lời

39

Bạn có thể sử dụng roundFloorCopy() để bắt chước DateUtils.truncate

Date truncateMonth = DateUtils.truncate(input, Calendar.MONTH); 
-> DateTime truncateMonth = input.dayOfMonth().roundFloorCopy(); 

Date truncateMinute = DateUtils.truncate(input, Calendar.MINUTE); 
-> DateTime truncateMinute = input.minuteOfDay().roundFloorCopy(); 

Date truncateHourOfDay = DateUtils.truncate(input, Calendar.HOUR_OF_DAY); 
-> DateTime truncateHourOfDay = input.hourOfDay().roundFloorCopy() 
+1

Đến nay, theo ý kiến ​​của tôi thì tốt nhất. Tôi cần ngày được "làm tròn" bởi một cái gì đó do người dùng chọn. Sử dụng [code] input.property (). RoundFloorCopy() [/ code] đã lưu rất nhiều mã tùy chỉnh. – DeezCashews

17

Hãy xem DateMidnight.

DateTime startOfMonth = new DateTime(new DateMidnight(input.withDayOfMonth(1))); 

Cập nhật: 2013/08/16 bởi JodaStephen: Phiên bản 2.3 của Joda thời gian deprecates DateMidnight vì nó là một ý tưởng rất xấu của một lớp.

Vì vậy, sử dụng:

DateTime startOfMonth = input.withDayOfMonth(1).withTimeAtStartOfDay(); 
+0

vì vậy tôi đoán bạn có nghĩa là: 'new DateMidnight (new DateTime())' –

+1

@Erick đúng, nhưng IMHO không phải là một lý do cho một downvote. Đây vẫn là một câu trả lời tốt –

+2

Tôi không hiểu tại sao đây là một câu trả lời tốt hơn bằng cách sử dụng 'withMillisOfDay (0)'. Đối tượng 'DateMidnight' không phải là đối tượng' DateTime', vì vậy một đối tượng phụ cần được tạo theo cách này. –

38

Sử dụng phương pháp withMillisOfDay() để rút ngắn cú pháp.

 
DateTime startOfMonth = input.withDayOfMonth(1).withMillisOfDay(0); 
+0

Câu trả lời của Bozho có lẽ là giải pháp "chính thức", nhưng tôi thích giải pháp này tốt hơn. Cảm ơn. –

+0

Tại sao bạn lại nghĩ vậy? Tôi không hiểu. Tôi cũng thích cái này hơn, bởi vì nó đòi hỏi số lượng tối thiểu các đối tượng được tạo ra. –

+0

Tại sao tôi lại nghĩ vậy? Bởi vì một lớp chuyên dụng tồn tại cho loại vấn đề chính xác này. –

1

Joda Thời gian cũng hỗ trợ phương pháp withFields trong các loại DateTime. Điều này cũng có thể được sử dụng để tạo cú pháp ngắn:

new DateTime().withDayOfMonth(1).withFields(new LocalTime(0, 0)); 

Trong mã sản xuất đối số là withFields nên được tính đến một hằng số.