2010-07-22 10 views
11

मुझे लगता है कि मैं दो दिनांक समय instants से बनाए जा चुके JodaTime अवधि होती है। क्या उस अवधि को दशमलव संख्या में बदलने के लिए कोई अच्छा तरीका है?एक जोडाटाइम अवधि को दशमलव संख्या में बदलने के लिए कोई भी तरीका है?

उदाहरण के लिए, मैं एक अवधि है कि 1 जनवरी, 2010 को 1:30 बजे करने के लिए दोपहर 1 बजे के से चला जाता है मैं 1.5 घंटे के रूप में है कि अवधि कैसे प्राप्त कर सकता है।

अतीत में मैं मैन्युअल रूप से इस जैसे सेकंड और BigDecimals का उपयोग कर परिवर्तित कर दिया है: जब मैं जोड़ने काल एक साथ शुरू

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

एक हैक की तरह महसूस करता इस तरह परेशान करने वाला नहीं उल्लेख करने के लिए। ऐसा लगता है कि एक बेहतर तरीका होना चाहिए।

कोई भी विचार? धन्यवाद

+1

आपको "डबल" से बचना चाहिए। आपका सामान्य दृष्टिकोण सही है, बस बिगडिसीमल में पहले सेकंड प्राप्त करें और फिर इसे डबल कास्ट के माध्यम से जाने के बजाय BigDecimal.valueOf (3600) द्वारा विभाजित करें। इस उदाहरण में यदि कोई अंतर होता है तो यह अधिक नहीं हो सकता है, लेकिन यह अच्छी प्रथा है। –

उत्तर

14

आप दो datetimes मिल गया है, तो मैं आपको बल्कि एक Period से उन दोनों के बीच एक Duration के लिए उम्मीद थी ... लेकिन अन्य की तुलना में और माइक की टिप्पणी, कि सही दिखता है:

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); 

ध्यान दें कि आप toStandardSeconds().getSeconds() बजाय Duration.getMillis() का उपयोग कर बच सकते हैं:

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

थोड़ा पुराने लेकिन मैं इस पर हाल ही में देख रहा था और आप DateTimeFormatterBuilder उपयोग कर सकते हैं यह करने के लिए। यह आदि appendFraction... कहा जाता है तरीकों की एक श्रृंखला है जो एक घंटा, मिनट का एक अंश में संलग्न कर देगा, दूसरी

यह आपको वास्तव में क्या नहीं के रूप में आप एक Period उपयोग कर रहे थे पूछ रहे थे, लेकिन आप इस के चारों ओर एक नया बनाकर काम कर सकते हैं है मध्यरात्रि में DateTime

यह फ़ॉर्मेटर अपने समयदिनाँक पार्स चाहिए:

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

तब आप अपने अवधि परिवर्तित करने के लिए कुछ इस तरह कर सकता है:

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

जॉन स्कीट उदाहरण का उपयोग करना, आप एक Non-terminating decimal expansion Exception से है इस के लिए BigDecimal divide(MILLIS_PER_HOUR) विभाजित करते हैं, ठीक त्रुटि बदलने कोड के लिए:

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); 
संबंधित मुद्दे