मैं दो के बीच के अंतर की गणना करने की कोशिश कर रहा हूं LocalDateTime
।
आउटपुट को प्रारूप का होना चाहिए y years m months d days h hours m minutes s seconds
। यहाँ मैंने जो लिखा है:
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.ZoneId;
public class Main {
static final int MINUTES_PER_HOUR = 60;
static final int SECONDS_PER_MINUTE = 60;
static final int SECONDS_PER_HOUR = SECONDS_PER_MINUTE * MINUTES_PER_HOUR;
public static void main(String[] args) {
LocalDateTime toDateTime = LocalDateTime.of(2014, 9, 9, 19, 46, 45);
LocalDateTime fromDateTime = LocalDateTime.of(1984, 12, 16, 7, 45, 55);
Period period = getPeriod(fromDateTime, toDateTime);
long time[] = getTime(fromDateTime, toDateTime);
System.out.println(period.getYears() + " years " +
period.getMonths() + " months " +
period.getDays() + " days " +
time[0] + " hours " +
time[1] + " minutes " +
time[2] + " seconds.");
}
private static Period getPeriod(LocalDateTime dob, LocalDateTime now) {
return Period.between(dob.toLocalDate(), now.toLocalDate());
}
private static long[] getTime(LocalDateTime dob, LocalDateTime now) {
LocalDateTime today = LocalDateTime.of(now.getYear(),
now.getMonthValue(), now.getDayOfMonth(), dob.getHour(), dob.getMinute(), dob.getSecond());
Duration duration = Duration.between(today, now);
long seconds = duration.getSeconds();
long hours = seconds / SECONDS_PER_HOUR;
long minutes = ((seconds % SECONDS_PER_HOUR) / SECONDS_PER_MINUTE);
long secs = (seconds % SECONDS_PER_MINUTE);
return new long[]{hours, minutes, secs};
}
}
मुझे जो आउटपुट मिल रहा है वह है 29 years 8 months 24 days 12 hours 0 minutes 50 seconds
। मैंने इस वेबसाइट (मानों 12/16/1984 07:45:55
और 09/09/2014 19:46:45
) के साथ अपना परिणाम चेक किया है । निम्न स्क्रीनशॉट आउटपुट दिखाता है:
मुझे पूरा यकीन है कि महीने के मूल्य के बाद के क्षेत्र मेरे कोड से गलत आ रहे हैं। कोई भी सुझाव बहुत मददगार होगा।
अपडेट करें
मैंने अपना परिणाम किसी अन्य वेबसाइट से परीक्षण किया है और मुझे जो परिणाम मिला है वह अलग है। यहाँ यह है: दो तिथियों के बीच की अवधि की गणना करें (परिणाम: 29 वर्ष, 8 महीने, 24 दिन, 12 घंटे, 0 मिनट और 50 सेकंड)।
अपडेट करें
चूंकि मुझे दो अलग-अलग साइटों से दो अलग-अलग परिणाम मिले, इसलिए मैं सोच रहा हूं कि मेरी गणना का एल्गोरिथ्म वैध है या नहीं। अगर मैं निम्नलिखित दो LocalDateTime
वस्तुओं का उपयोग करता हूं :
LocalDateTime toDateTime = LocalDateTime.of(2014, 9, 10, 6, 40, 45);
LocalDateTime fromDateTime = LocalDateTime.of(1984, 12, 16, 7, 45, 55);
फिर आउटपुट आ रहा है: 29 years 8 months 25 days -1 hours -5 minutes -10 seconds.
इस लिंक से यह होना चाहिए 29 years 8 months 24 days 22 hours, 54 minutes and 50 seconds
। इसलिए एल्गोरिथ्म को नकारात्मक संख्याओं को भी संभालने की आवश्यकता है।
ध्यान दें प्रश्न यह नहीं है कि किस साइट ने मुझे क्या परिणाम दिया है, मुझे सही एल्गोरिथ्म जानने की आवश्यकता है और सही परिणाम होने की आवश्यकता है।
7:45:55
और अंतिम समय 19:46:45
(या 7:46:45
PM) मिलेगा । तो उन दो समय के बीच का अंतर 12 घंटे, 0 मिनट और 50 सेकंड है और कभी भी 23 घंटे, 34 मिनट और 12 सेकंड नहीं है। तो आपकी गणना वास्तविक सही प्रतीत होती है, कम से कम समय भाग पर।
LocalDateTime
कोई समय क्षेत्र नहीं है, इसलिए अद्वितीय उत्तर नहीं हो सकता है। यहां तक कि अगर आप शुरू और अंत समय क्षेत्रों को एक ही मानते हैं, तो कुछ क्षेत्रों में 2014-09-09 जैसे डेलाइट सेविंग टाइम या समर टाइम और अन्य में नहीं होगा। यह एक घंटे से चीजों को फेंक सकता है। इसलिए जब तक यह हल नहीं हो जाता तब तक दूसरे के अंतर को समझना व्यर्थ है।
LocalDateTime
पैदावार का उपयोग अवास्तविक परिणामों के रूप में किया जाता है, क्योंकि उस वर्ग में समय क्षेत्र या ऑफसेट-यूटीसी की किसी भी अवधारणा का अभाव है? यथार्थवादी मूल्यों के लिए, ZoneId
उपयोग के माध्यम से एक समय क्षेत्र असाइन करें ZonedDateTime
।
Period.between()
कुछ गोलाई लागू कर सकते हैं?