2010-07-22 39 views
11

Tôi có khoảng thời gian JodaTime mà tôi đã tạo từ hai phiên bản DateTime. Có cách nào tốt để chuyển đổi Khoảng thời gian đó thành số thập phân của giờ không?Bất kỳ cách nào để chuyển đổi Thời gian JodaTime thành số thập phân của giờ?

Ví dụ: tôi có một khoảng thời gian từ 1 giờ chiều đến 1 giờ 30 chiều ngày 1 tháng 1 năm 2010. Làm cách nào tôi có thể nhận được khoảng thời gian đó là 1,5 giờ.

Trong quá khứ tôi đã tự chuyển đổi bằng giây và BigDecimals như thế này:

int seconds = myPeriod.toStandardSeconds().getSeconds(); 
BigDecimal d = new BigDecimal((double) seconds/3600); 
// Round to two decimals 
BigDecimal correctResult = d.setScale(2, RoundingMode.HALF_DOWN); 

Đây là loại cảm giác giống như một hack, chưa kể đến lúng túng khi tôi bắt đầu Thời hạn thêm với nhau. Có vẻ như có một cách tốt hơn.

Bất kỳ ý tưởng nào? Cảm ơn

+1

Bạn nên tránh "tăng gấp đôi". Cách tiếp cận chung của bạn là đúng, chỉ cần nhận được giây trong BigDecimal đầu tiên và sau đó chia nó bằng BigDecimal.valueOf (3600) thay vì đi qua một diễn viên đôi. Trong trường hợp này nó có thể không tạo ra nhiều nếu có bất kỳ sự khác biệt nào, nhưng đó là thực hành tốt. –

Trả lời

14

Nếu bạn đã có hai DateTimes, tôi mong đợi bạn để có một Duration giữa chúng chứ không phải là một Period ... nhưng khác hơn là và ý kiến ​​của Mike, đó có vẻ đúng:

private static final BigDecimal SECONDS_PER_HOUR = 
    BigDecimal.valueOf(DateTimeConstants.SECONDS_PER_HOUR); 
... 
DateTime dt1 = ...; 
DateTime dt2 = ...; 
Duration duration = new Duration(dt1, dt2); 
BigDecimal result = BigDecimal.valueOf(duration.toStandardSeconds().getSeconds()) 
           .divide(SECONDS_PER_HOUR) 
           .setScale(2, RoundingMode.HALF_DOWN); 

Lưu ý rằng bạn có thể tránh toStandardSeconds().getSeconds() sử dụng Duration.getMillis() thay vì:

private static final BigDecimal MILLIS_PER_HOUR = 
    BigDecimal.valueOf(DateTimeConstants.MILLIS_PER_HOUR); 
... 
DateTime dt1 = ...; 
DateTime dt2 = ...; 
Duration duration = new Duration(dt1, dt2); 
BigDecimal result = BigDecimal.valueOf(duration.getMillis()) 
           .divide(MILLIS_PER_HOUR) 
           .setScale(2, RoundingMode.HALF_DOWN); 
2

Một chút cũ nhưng tôi đang tìm kiếm tại này thời gian gần đây và bạn có thể sử dụng DateTimeFormatterBuilder để làm điều này. Nó có một loạt các phương pháp được gọi là appendFraction... sẽ thêm một phần của một giờ, phút, giây, v.v.

Đây không phải chính xác những gì bạn đang hỏi khi bạn đang sử dụng Period nhưng bạn có thể giải quyết vấn đề này bằng cách tạo mới DateTime lúc nửa đêm.

định dạng này nên phân tích DateTime của bạn:

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
    .appendHourOfDay(1) 
    .appendLiteral(".") 
    .appendFractionOfHour(1, 2).toFormatter(); 

Sau đó, bạn có thể làm một cái gì đó như thế này để chuyển đổi thời gian của bạn:

DateMidnight midnight = new DateTime("2012-12-13T21:39:45.618").toDateMidnight(); 
    LocalTime localTime = new LocalTime(midnight); 
    localTime.plus(period); 
    formatter.print(localTime); 
0

Sử dụng Jon Skeet Ví dụ, bạn có một Non-terminating decimal expansion Exception từ chia BigDecimal divide(MILLIS_PER_HOUR), để sửa lỗi sửa đổi mã cho điều này:

private static final BigDecimal MILLIS_PER_HOUR = 
    BigDecimal.valueOf(DateTimeConstants.MILLIS_PER_HOUR); 




    DateTime t = new DateTime(); 
    DateTime t1 = new DateTime(); 
    DateTime dt1 = t; 
    DateTime dt2 = t1.plusMinutes(46); 
    Duration duration = new Duration(dt1, dt2); 
    BigDecimal result = BigDecimal.valueOf(duration.getMillis()) 
          .divide(MILLIS_PER_HOUR, 2, RoundingMode.CEILING) // <--- Add scale and RoundingMode.CEILING 
          .setScale(2); 
Các vấn đề liên quan