Εμφάνιση 1-11 από 11
  1. #1
    Εγγραφή
    24-09-2010
    Περιοχή
    Χαλκιδική
    Ηλικία
    28
    Μηνύματα
    743
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL
    Ταχύτητα
    24mbps
    ISP
    ΟΤΕ Conn-x
    Router
    ZTE ZXHN H108NS
    Καλησπέρα.

    Προσπαθώ να βρω έναν τρόπο για να υπολογίζω την απόσταση μεταξύ 2 αντικειμένων ημερομηνίας ή 2 αντικειμένων χρόνου όπου το κάθε ένα έχει το εξής format:

    Ημερομηνία = day/month/year

    Χρόνος = hours:minutes:seconds

    Για παράδειγμα εάν έχω δύο χρόνους: 00:10:05 και 00:20:00 το αποτέλεσμα είναι: 55 δευτερόλεπτα για να φτάσω στον χρόνο 00:11:00 και άλλα 9 λεπτά άρα τελικά η απόσταση είναι: 00:09:55

    Ο μόνος αλγόριθμος που σκέφτηκα είναι να μετατρέπω όλο τον χρόνο στην χαμηλότερη μονάδα (δευτερόλεπτα) να αφαιρώ το μεγαλύτερο από το μικρότερο και το αποτέλεσμα (σε δευτερόλεπτα) να το
    ξανά μετατρέπω σε format χρόνου.

    Κάτι τέτοιο δηλαδή:
    Κώδικας:
    //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)
    }
    Άρα, εάν έχω δύο χρόνους σε Time format απλώς χρησιμοποιώ την μέθοδο toSeconds() για να μετατρέψω και τους δύο χρόνους σε δευτερόλεπτα, στην συνέχεια αφαιρώ το μεγαλύτερο από το μικρότερο και τέλος
    με την μέθοδο 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=============================#
    Τελευταία επεξεργασία από το μέλος babaliaris : 29-05-17 στις 23:04.

  2. #2
    Εγγραφή
    01-04-2007
    Ηλικία
    36
    Μηνύματα
    841
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL2+
    Ταχύτητα
    11.438 / 1.018
    ISP
    Wind
    DSLAM
    Wind - ΤΟΥΜΠΑ
    Αν το κάνεις μόνος σου πρέπει να υπολογίσεις leap years (και leap seconds αν θα έχεις μεικτούς χρόνους, δλδ και date και time)

    Μπορείς να δεις πως γίνεται στη βιβλιοθήκη datetime.

    - - - Updated - - -

    Ο αλγόριθμος για τα δίσεκτα χρόνια είναι γνωστός και για τα δευτερόλεπτα όλο και κάπου θα υπάρχει.

  3. #3
    Εγγραφή
    24-09-2010
    Περιοχή
    Χαλκιδική
    Ηλικία
    28
    Μηνύματα
    743
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL
    Ταχύτητα
    24mbps
    ISP
    ΟΤΕ Conn-x
    Router
    ZTE ZXHN H108NS
    Παράθεση Αρχικό μήνυμα από guardianhelm Εμφάνιση μηνυμάτων
    Αν το κάνεις μόνος σου πρέπει να υπολογίσεις leap years (και leap seconds αν θα έχεις μεικτούς χρόνους, δλδ και date και time)

    Μπορείς να δεις πως γίνεται στη βιβλιοθήκη datetime.

    - - - Updated - - -

    Ο αλγόριθμος για τα δίσεκτα χρόνια είναι γνωστός και για τα δευτερόλεπτα όλο και κάπου θα υπάρχει.
    Είχα ξεχάσει εντελώς ότι υπάρχουν leap years. Τέλος πάντων, αφού έχει λυθεί ήδη το πρόβλημα, απλώς ήμουν περίεργος.

  4. #4
    Εγγραφή
    06-07-2005
    Περιοχή
    Νέα Υόρκη
    Ηλικία
    49
    Μηνύματα
    11.655
    Downloads
    6
    Uploads
    2
    Τύπος
    Cable
    Ταχύτητα
    300 Mbps down/10 Mbps up
    ISP
    Spectrum
    Παράθεση Αρχικό μήνυμα από babaliaris Εμφάνιση μηνυμάτων
    Είχα ξεχάσει εντελώς ότι υπάρχουν leap years. Τέλος πάντων, αφού έχει λυθεί ήδη το πρόβλημα, απλώς ήμουν περίεργος.
    Αν θες να γίνεις παρανοϊκός υπάρχει και η αλλαγή από Ιουλιανό σε Γρηγοριανό ημερολόγιο, η οποία έχει 10 μέρες διαφορά το 1582 όταν υιοθετήθηκε η αλλαγή, η οποία αυξάνει κατά μία μέρα κάθε 100 χρόνια αλλά όχι στα χρόνια που διαιρούνται με 400, λόγω του νέου υπολογισμού που υιοθετήθηκε για τα δίσεκτα έτη.

  5. #5
    Εγγραφή
    02-11-2003
    Περιοχή
    Επαναπατρισθείς στην Αθήνα
    Ηλικία
    49
    Μηνύματα
    56.427
    Downloads
    64
    Uploads
    73
    Τύπος
    VDSL2
    Ταχύτητα
    102400/10240
    ISP
    Vodafone
    Path Level
    Fastpath
    Ρε παιδιά τί γλώσσα είναι αυτή;

    Είναι μεν C-like, αλλά δεν είναι C, C++, C#, Java, php.
    Επιτέλους το ελάχιστο δυνατό, ευέλικτο, και ψηφιακό κράτος. Με διαρκή αξιολόγηση.

  6. #6
    Εγγραφή
    23-05-2016
    Ηλικία
    50
    Μηνύματα
    9
    Downloads
    1
    Uploads
    0
    ISP
    ΟΤΕ Conn-x
    Σε όλες τις γλώσσες (τουλάχιστον όσες ξέρω) υπάρχουν βιβλιοθήκες που μετατρέπουν την ημ/νία - ώρα σε έναν αριθμό (υπολογίζοντας δισεκτα, κλπ).
    Στην 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;
    }

  7. #7
    Εγγραφή
    08-01-2004
    Περιοχή
    Αθήνα/Αγ.Δημήτριος
    Μηνύματα
    386
    Downloads
    5
    Uploads
    0
    Νομίζω ταιριάζει αυτό (tl;dw: χρησιμοποίησε library)


  8. #8
    Εγγραφή
    24-09-2010
    Περιοχή
    Χαλκιδική
    Ηλικία
    28
    Μηνύματα
    743
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL
    Ταχύτητα
    24mbps
    ISP
    ΟΤΕ Conn-x
    Router
    ZTE ZXHN H108NS
    Παράθεση Αρχικό μήνυμα από WAntilles Εμφάνιση μηνυμάτων
    Ρε παιδιά τί γλώσσα είναι αυτή;

    Είναι μεν C-like, αλλά δεν είναι C, C++, C#, Java, php.
    Python

  9. #9
    Εγγραφή
    01-04-2007
    Ηλικία
    36
    Μηνύματα
    841
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL2+
    Ταχύτητα
    11.438 / 1.018
    ISP
    Wind
    DSLAM
    Wind - ΤΟΥΜΠΑ
    Παράθεση Αρχικό μήνυμα από mezger Εμφάνιση μηνυμάτων
    Νομίζω ταιριάζει αυτό (tl;dw: χρησιμοποίησε library)

    Ακόμα και με βιβλιοθήκη θέλει εξαιρετική προσοχή όταν πας από τη μια στην άλλη, ακόμα και στο προφανές, όπως το να σώσεις τις ημερομηνίες/ώρες σε βάση. Κυριως, αλλά όχι μόνο, λόγω timezones...

  10. #10
    Εγγραφή
    24-09-2010
    Περιοχή
    Χαλκιδική
    Ηλικία
    28
    Μηνύματα
    743
    Downloads
    0
    Uploads
    0
    Τύπος
    ADSL
    Ταχύτητα
    24mbps
    ISP
    ΟΤΕ Conn-x
    Router
    ZTE ZXHN H108NS
    Παράθεση Αρχικό μήνυμα από mezger Εμφάνιση μηνυμάτων
    Νομίζω ταιριάζει αυτό (tl;dw: χρησιμοποίησε library)

    χαχα πέθανα στα γέλια! Δίκαιο έχει πάντως

  11. #11
    Εγγραφή
    02-11-2003
    Περιοχή
    Επαναπατρισθείς στην Αθήνα
    Ηλικία
    49
    Μηνύματα
    56.427
    Downloads
    64
    Uploads
    73
    Τύπος
    VDSL2
    Ταχύτητα
    102400/10240
    ISP
    Vodafone
    Path Level
    Fastpath
    Πόνεσαν τα μάτια μας.

    Βάλε spoiler + code tags.

    ΕΛΕΟC.
    Επιτέλους το ελάχιστο δυνατό, ευέλικτο, και ψηφιακό κράτος. Με διαρκή αξιολόγηση.

Παρόμοια Θέματα

  1. VDSL απόσταση απο καμπίνα
    Από Gladiator στο φόρουμ VDSL
    Μηνύματα: 2
    Τελευταίο Μήνυμα: 01-10-16, 16:48
  2. Μηνύματα: 10
    Τελευταίο Μήνυμα: 21-08-16, 15:32
  3. Επικοινωνία μεταξύ δύο subnets
    Από drthanwho στο φόρουμ Networking
    Μηνύματα: 13
    Τελευταίο Μήνυμα: 10-07-16, 17:09
  4. [Other] Ubiquiti Wifi lan 5GHz σε απόσταση
    Από aaaooll στο φόρουμ ADSL & Broadband Hardware, routers και modems...
    Μηνύματα: 2
    Τελευταίο Μήνυμα: 30-06-16, 22:06
  5. Μηνύματα: 0
    Τελευταίο Μήνυμα: 19-06-16, 14:52

Bookmarks

Bookmarks

Δικαιώματα - Επιλογές

  • Δεν μπορείτε να δημοσιεύσετε νέα θέματα
  • Δεν μπορείτε να δημοσιεύσετε νέα μηνύματα
  • Δεν μπορείτε να αναρτήσετε συνημμένα
  • Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας
  •  
  • Τα BB code είναι σε λειτουργία
  • Τα Smilies είναι σε λειτουργία
  • Το [IMG] είναι σε λειτουργία
  • Το [VIDEO] είναι σε λειτουργία
  • Το HTML είναι εκτός λειτουργίας