Καλησπέρα.
Προσπαθώ να βρω έναν τρόπο για να υπολογίζω την απόσταση μεταξύ 2 αντικειμένων ημερομηνίας ή 2 αντικειμένων χρόνου όπου το κάθε ένα έχει το εξής format:
Ημερομηνία = day/month/year
Χρόνος = hours:minutes:seconds
Για παράδειγμα εάν έχω δύο χρόνους: 00:10:05 και 00:20:00 το αποτέλεσμα είναι: 55 δευτερόλεπτα για να φτάσω στον χρόνο 00:11:00 και άλλα 9 λεπτά άρα τελικά η απόσταση είναι: 00:09:55
Ο μόνος αλγόριθμος που σκέφτηκα είναι να μετατρέπω όλο τον χρόνο στην χαμηλότερη μονάδα (δευτερόλεπτα) να αφαιρώ το μεγαλύτερο από το μικρότερο και το αποτέλεσμα (σε δευτερόλεπτα) να το
ξανά μετατρέπω σε format χρόνου.
Κάτι τέτοιο δηλαδή:
Άρα, εάν έχω δύο χρόνους σε Time format απλώς χρησιμοποιώ την μέθοδο toSeconds() για να μετατρέψω και τους δύο χρόνους σε δευτερόλεπτα, στην συνέχεια αφαιρώ το μεγαλύτερο από το μικρότερο και τέλοςΚώδικας://Return a Time format to seconds. int toSeconds(hours, minutes, seconds){ return hours*3600 + minutes*60 + seconds } //Return a time format from seconds. Time toFormat(seconds){ hours = (int)seconds / 3600 seconds -= hours * 3600 minutes = (int)seconds / 60 seconds -= minutes * 60 return new Time(hours, minutes, seconds) }
με την μέθοδο toFormat() μετατρέπω το αποτέλεσμα πάλι σε Time format.
Δουλεύει σωστά αυτό? Πως θα κάνω κάτι αντίστοιχο για τις ημερομηνίες;
Έχω ψάξει στο google και δεν μπορώ να βρω κάποιον αλγόριθμο που να λύνει αυτό το πρόβλημα.
Εάν υπάρχει κάποιος γνωστός και καλός αλγόριθμος θα ήθελα να τον ξέρω
Ευχαριστώ.
Όποιος θέλει μπορεί να δει και τον κώδικα μου μέχρι τώρα:
Σας το χρωμάτισα και με το χέρι για να είναι ποιο κατανοητός
Κώδικας:class TimeFormat: #-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-Constructor-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-# def __init__(self, string = "00:00:00"): allFine = True #Check type of string. if type(string) != str: raise AttributeError("Attribute: string, must be type of str.") #Check format. if len(string) != 8 or string[2:3] != ":" or string[5:6] != ":": raise AttributeError("Attribute: string, must be in"+\ " this format = hh:mm:ss") #Try to convert characters to integers. try: self.hours = int( string[0:2] ) self.minutes = int( string[3:5] ) self.seconds = int( string[6:8] ) pass #Wrong characters. except ValueError: allFine = False pass #Raise ValueError. if not allFine: raise ValueError("Attribute string: hh:mm:ss must be"+\ " integer numbers.") #-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-Constructor-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-# #============================To Seconds Method============================# def toSeconds(self): return self.hours*3600 + self.minutes*60 + self.seconds #============================To Seconds Method============================# #===============Load From Seconds Method==============# def loadFromSeconds(self, seconds): #Get hours. self.hours = seconds // 3600 #Remove the hours from the time. seconds -= self.hours * 3600 #Get seconds. self.minutes = seconds // 60 #Remove the seconds from the time. seconds -= self.minutes * 60 #Get the seconds. self.seconds = seconds #===============Load From Seconds Method==============# #===================Substract Method==================# def subtract(self, other): #Create a new TimeFormat object. new_time = TimeFormat() #Calculate the difference. difference = self.toSeconds() - other.toSeconds() #Get the absolute value. if difference < 0: difference = - difference pass #Load to the new_time. new_time.loadFromSeconds(difference) #Return. return new_time #===================Substract Method==================# #============================To String Method=============================# def toString(self): #String variable. string = "" #----------Converting Hours----------# #Equal to zero. if self.hours == 0: string += "00:" pass #Less than 10. elif self.hours < 10: string += '0'+str(self.hours)+":" pass #Greater or equal to 10. else: string += str(self.hours)+":" pass #----------Converting Hours----------# #---------Converting Minutes---------# #Equal to zero. if self.minutes == 0: string += "00:" pass #Less than 10. elif self.minutes < 10: string += '0'+str(self.minutes)+":" pass #Greater or equal to 10. else: string += str(self.minutes)+":" pass #---------Converting Minutes---------# #---------Converting Seconds---------# #Equal to zero. if self.seconds == 0: string += "00" pass #Less than 10. elif self.seconds < 10: string += '0'+str(self.seconds) pass #Greater or equal to 10. else: string += str(self.seconds) pass #---------Converting Seconds---------# #Return the string. return string #============================To String Method=============================#
Εμφάνιση 1-11 από 11
-
29-05-17, 22:04 Απόσταση μεταξύ δύο αντικειμένων ημερομηνίας. #1
Τελευταία επεξεργασία από το μέλος babaliaris : 29-05-17 στις 23:04.
-
30-05-17, 17:05 Απάντηση: Απόσταση μεταξύ δύο αντικειμένων ημερομηνίας. #2
Αν το κάνεις μόνος σου πρέπει να υπολογίσεις leap years (και leap seconds αν θα έχεις μεικτούς χρόνους, δλδ και date και time)
Μπορείς να δεις πως γίνεται στη βιβλιοθήκη datetime.
- - - Updated - - -
Ο αλγόριθμος για τα δίσεκτα χρόνια είναι γνωστός και για τα δευτερόλεπτα όλο και κάπου θα υπάρχει.
-
31-05-17, 00:46 Απάντηση: Απόσταση μεταξύ δύο αντικειμένων ημερομηνίας. #3
-
31-05-17, 05:29 Απάντηση: Απόσταση μεταξύ δύο αντικειμένων ημερομηνίας. #4
Αν θες να γίνεις παρανοϊκός υπάρχει και η αλλαγή από Ιουλιανό σε Γρηγοριανό ημερολόγιο, η οποία έχει 10 μέρες διαφορά το 1582 όταν υιοθετήθηκε η αλλαγή, η οποία αυξάνει κατά μία μέρα κάθε 100 χρόνια αλλά όχι στα χρόνια που διαιρούνται με 400, λόγω του νέου υπολογισμού που υιοθετήθηκε για τα δίσεκτα έτη.
-
31-05-17, 08:47 Απάντηση: Απόσταση μεταξύ δύο αντικειμένων ημερομηνίας. #5
Ρε παιδιά τί γλώσσα είναι αυτή;
Είναι μεν C-like, αλλά δεν είναι C, C++, C#, Java, php.Επιτέλους το ελάχιστο δυνατό, ευέλικτο, και ψηφιακό κράτος. Με διαρκή αξιολόγηση.
-
31-05-17, 09:23 Απάντηση: Απόσταση μεταξύ δύο αντικειμένων ημερομηνίας. #6
Σε όλες τις γλώσσες (τουλάχιστον όσες ξέρω) υπάρχουν βιβλιοθήκες που μετατρέπουν την ημ/νία - ώρα σε έναν αριθμό (υπολογίζοντας δισεκτα, κλπ).
Στην Java π.χ. έχουμε έναν ακέραιο αριθμό που μας δείχνει τα milliseconds που περάσαν από 1/1/1970 (Calendar.getTimeInMillis(), Date.getTime())
Κάτι ανάλογο έχουμε και στην C++
Στην Delphi είχαμε έναν αριθμό με δεκαδικά που μας δείχνει τις ημέρες που περάσαν από 1/1/1900 (αν θυμάμαι καλά). Με τα δεδαδικά βρίσκουμαι και τις ώρες - λεπτά - κλπ
Εάν θέλεις όμως μπορείς να χρησιμοποιήσεις και μια ρουτίνα που έχω φτιάξει σε java και έχει όλες τις διορθώσεις, και δίνει τα milliseconds από 1/1/1970
(Δουλεύει και για ημ/νίες πριν από το 1970 - μας επιστρέφει αρνητικό αριθμό)
public static long encode_date_time(int year, int month, int day,
int hour, int min, int sec, int msec) {
final int ENCODE_DELTA = 693594 + 25568 + 1;
final int[] ENCODE_MONTH_DELTA = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
final int[] ENCODE_MONTH_DELTA_LEAP = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335};
month--;
year += (month / 12);
month = (month % 12);
if (month < 0) {
month += 12;
year--;
}
boolean leapYear = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
int monthdays = leapYear ? ENCODE_MONTH_DELTA_LEAP[month]
: ENCODE_MONTH_DELTA[month];
int corr;
if (year > 0) {
year--;
corr = (year / 4) - (year / 100) + (year / 400);
} else {
corr = (year / 4) - (year / 100) + (year / 400) - 1;
year--;
}
long date = (year * 365) + corr + monthdays + day - ENCODE_DELTA;
long time = msec
+ (sec * 1000)
+ (min * 1000 * 60)
+ (hour * 1000 * 60 * 60);
return (date * 86400000) + time;
}
-
31-05-17, 10:49 Απάντηση: Απόσταση μεταξύ δύο αντικειμένων ημερομηνίας. #7
Νομίζω ταιριάζει αυτό (tl;dw: χρησιμοποίησε library)
-
31-05-17, 14:41 Απάντηση: Απόσταση μεταξύ δύο αντικειμένων ημερομηνίας. #8
-
31-05-17, 15:51 Απάντηση: Απόσταση μεταξύ δύο αντικειμένων ημερομηνίας. #9
-
02-06-17, 01:08 Απάντηση: Απόσταση μεταξύ δύο αντικειμένων ημερομηνίας. #10
-
02-06-17, 15:38 Απάντηση: Απόσταση μεταξύ δύο αντικειμένων ημερομηνίας. #11
Πόνεσαν τα μάτια μας.
Βάλε spoiler + code tags.
ΕΛΕΟC.Επιτέλους το ελάχιστο δυνατό, ευέλικτο, και ψηφιακό κράτος. Με διαρκή αξιολόγηση.
Παρόμοια Θέματα
-
VDSL απόσταση απο καμπίνα
Από Gladiator στο φόρουμ VDSLΜηνύματα: 2Τελευταίο Μήνυμα: 01-10-16, 16:48 -
Ασύρματη σύνδεση μεταξύ 2 σημείων σε απόσταση 200m
Από LIQUID_ στο φόρουμ Wireless NetworkingΜηνύματα: 10Τελευταίο Μήνυμα: 21-08-16, 15:32 -
Επικοινωνία μεταξύ δύο subnets
Από drthanwho στο φόρουμ NetworkingΜηνύματα: 13Τελευταίο Μήνυμα: 10-07-16, 17:09 -
[Other] Ubiquiti Wifi lan 5GHz σε απόσταση
Από aaaooll στο φόρουμ ADSL & Broadband Hardware, routers και modems...Μηνύματα: 2Τελευταίο Μήνυμα: 30-06-16, 22:06 -
LG 43UH610V: απόσταση (cm) ανάμεσα στα ποδαράκια στήριξης και εντυπώσεις
Από greatst στο φόρουμ DVB-T, Tηλεοράσεις, IPTVΜηνύματα: 0Τελευταίο Μήνυμα: 19-06-16, 14:52
Bookmarks