Προς το περιεχόμενο

Υπολογισμός ημερομηνίας με jquery


Roland

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας

Έχω μια φόρμα με ένα πεδίο ημερομηνίας που βάζοντας ο χρήστης μια προγενέστερη ημερομηνία το script μας λέει πόσοι μήνες μεσολαβούν.

Δείτε εδώ ένα demo

 

Ο κώδικας είναι:

 

var date1 = $('#date1').val();

var minutes = 1000*60;

var hours = minutes*60;

var days = hours*24;

 

var foo_date1 = getDateFromFormat("10/11/2010", "d/M/y");

var foo_date2 = new Date();

 

var diff_date = Math.round((foo_date2 - foo_date1)/days);

var Result = ("Οι μήνες που μεσολαβούν είναι: " + diff_date );

 

Τώρα την ημερομηνία δε την παίρνει από το πεδίο αλλά είναι απευθείας γραμμένη στον κώδικα.

Τι αλλαγή πρέπει να κάνω για να παίρνει την ημερομηνία από το πεδίο "date1" ?

δοκίμασα

var foo_date1 = getDateFromFormat(date1, "d/M/y");

 

αλλά μου επιστρέφει πολύ μεγάλο αριθμό μηνών.

 

Αν ξέρει κάποιος ας μου πει.

 

Ευχαριστώ

Δημοσ.

Για αρχή.. this aint jim beam (εεε... jquery ήθελα να πω).

 

>
<html>
<head>
<title>dates shit</title>
<script language="javascript" src="date.js"></script>
</head>
<body>
<form>
<input type="text" name="date1" value="" size=10>
<input type="text" name="output" value="" size=10>
<input type="button" value="Go!" onClick="this.form.output.value= Math.ceil((new Date() - new Date(getDateFromFormat(this.form.date1.value,'d/M/y')))/1000/60/60/24/30)">
</form>
</body>
</html>

 

Με αυτό θα έχεις περίπου αυτό που θες. Για να έχεις διαφορά σε μέρες βγάζεις το "δια 30" απο τη διαίρεση. Επίσης αναλόγως τι θα χρησιμοποιήσεις (round, ceil, floor) θα έχεις διαφορετικό αποτέλεσμα.

 

Με το ceil ας πούμε απο τις 30/10/2010 έχουν περάσει 2 μήνες ενώ με floor έχει περάσει 1 μήνας. Επίσης δεν έχω ιδέα τι γίνεται για τα δίσεκτα.. δε το δοκίμασα.

Δημοσ.

orotoi

ευχαριστώ πολύ για την απάντηση και τη βοήθεια

προσάρμοσα την πρόταση σου με προσθήκη <form> </form> demo1

και ο jquery έγινε έτσι

 

 

>            var date1 = $('#date1').val(); 
                  
               var minutes = 1000*60; 
               var hours = minutes*60; 
               var days = hours*24; 
               var months = days*30; 

               var foo_date1 = getDateFromFormat(this.form.date1.value, "d/M/y"); 
               var foo_date2 = new Date(); 
               
               var diff_date = Math.round((foo_date2 - foo_date1)/months); 
           
           var Result = ("Οι μήνες που μεσολαβούν είναι: " + diff_date );
           $("#ResultText").text(Result).hide().fadeIn(400);
           $("#Border").hide().fadeIn(400);

 

 

Σκευτόμουν αν υπάρχει τρόπος αντί να κανουμε φόρμα

var foo_date1 = getDateFromFormat(this.form.date1.value, "d/M/y");

 

να προσθεσουμε το πεδίο date1 σαν μεταβλητή

πχ

var foo_date1 = getDateFromFormat(date1, "d/M/y");

ή

var foo_date1 = getDateFromFormat($('#date1').val(), "d/M/y");

ή

var foo_date1 = getDateFromFormat(('#date1').val(), "d/M/y");

 

δοκίμασα πολλές εκδοχές αλλα καμιά δε δούλεψε

Δημοσ.

ε αυτό έχεις κάνει απλώς αντι να θέσεις μια μεταβλητή με την τιμή του input χρησιμοποιείς κατευθείαν το this.form....

λογικά μπορείς να πεις date1 = this.form.... Αλλά ποιό το νόημα? Περιττό επίσης μου φαίνεται να υπολογίζεις τα minutes,hours,dates κτλ.. Βάλε κατευθείαν στο months το αποτέλεσμα του 1000*60*60*24*30 (καλά οχι οτι είναι καμιά σημαντική επιβάρυνση.. αλλά λέμε τώρα.. έτσι για τη κ@υλα..)

 

Επίσης δε ξέρω πόσο critical είναι αυτό που θες να κάνεις και τι ακρίβεια θες. Οπως σου είπα πριν ανάλογα τι θα χρησιμοποιήσεις (ceil, floor κτλ) θα έχεις άλλο αποτέλεσμα.

Δημοσ.

Επίσης δε ξέρω πόσο critical είναι αυτό που θες να κάνεις και τι ακρίβεια θες. Οπως σου είπα πριν ανάλογα τι θα χρησιμοποιήσεις (ceil, floor κτλ) θα έχεις άλλο αποτέλεσμα.

 

Αυτό που προσπαθώ να κάνω για έναν φίλο μου που έχει μια σελίδα με pets είναι μια φόρμα για online υπολογισμό του επόμενου εμβολίου.

Περισσότερο όμως το κάνω για να ασχοληθώ και να καταλάβω πως λειτουργούν κάποια πράγματα σε σχέση με τη javascript και την jquery, και η αλήθεια είναι ότι με όλο αυτό το ψάξιμο που έκανα και με τη δική σου βοήθεια βοηθήθηκα πάρα πολύ.

 

Θα μπορούσα να κάνω ένα post και να πω "Παιδιά θέλω να κάνω αυτό κι αυτό...πως γίνεται?" και είμαι σίγουρος πως κάποιος από το forum θα μου έδινε την πλήρη λύση. Αλλά εγώ δε καίγομαι τόσο πολύ για την πλήρη λύση, όσο για την εξοικείωση και για τη γνώση.

 

Οπότε να ξέρεις ότι εκτίμησα ιδιαίτερα τις απαντήσεις σου και σ' ευχαριστώ.

 

Τώρα σχετικά με το script εφόσον κατάφερα να βρίσκω το πλήθος των μηνών επόμενος στόχος είναι το μήνυμα που βγάζει να μην είναι

"Οι μήνες που μεσολαβούν είναι: 11"

Αλλά αν οι μήνες είναι < από το 12

Μήνυμα: " Ο εμβολιασμός πρέπει να γίνει στις 15/1/2011"

αν οι μήνες είναι > από το 12

Μήνυμα: " Ο εμβολιασμός έπρεπε να γίνει στις 15/1/2011. Παρακαλούμε επικοινωνήστε μαζί μας"

 

Θα προσπαθήσω να το κάνω , θεωρητικά ξέρω τι πρέπει να γίνει, αλλά δε γνωρίζω πώς να το διατυπώσω. Οπότε αν τα βρω σκούρα θα ξαναρωτήσω.

Δημοσ.

καλή φάση.. και δω καθόμαστε (η αδερφή δλδ αλλα οκ) και τα γράφουμε στο βιβλιάριο του.. χαχαα.. θα της φτιάξω κανα τέτοιο..

 

Αν παίζεις με mysql.. μπορείς να έχεις ενα πίνακα με όποια στοιχεία του χρήστη θέλεις (και του σκύλου ή άλλου pet τελος πάντων) και

ενα πεδίο με την τελευταία ημερομηνία εμβολιασμού

ένα πεδίο με την επόμενη ημ/νια εμβολιασμού (θα υπολογίζεται απο την τελευταία + <χρόνο>*

 

και όταν ο χρήστης κάνει login θα του εμφανίζει απλώς την επόμενη ημ/νια εμβολιασμού και ίσως τις ημέρες που πλησιάζουν σε αυτή να του το εμφανίζει με ενα διαφορετικό τρόπο υπενθύμισης.. πχ "Να θυμηθείς σε 9 μέρες να εμβολιάσεις τον <όνομα_σκύλου>!"

 

*<χρόνο>, αυτό μπορείς να το έχεις σε ενα άλλο πίνακα που θα συσχετίζεις τύπο εμβολίου με απαιτούμενο χρόνο, αφού κάποια εμβόλια θέλουν να γίνονται ανα διαφορετικά χρονικά διαστήματα (έχω την εντύπωση).

 

Οπότε έχεις ενα πίνακα με τα στοιχεία του χρήστη και άλλο πίνακα με τα στοιχεία του σκύλου όπου σε αυτόν θα έχεις τα εμβόλια που έχει κάνει για παράδειγμα και αντίστοιχα τις ημερομηνίες τους και το πότε είναι η επόμενη για το καθένα..

 

Ψήθηκα.. :)

Δημοσ.

Έκανα μια πρόοδο

demo2

 

Πρόσθεσα τον κώδικα

>                var diff_date = Math.round((foo_date2 - foo_date1)/months); 
                   if (diff_date > 12)
		        {var Result = ("Ο εμβολιασμός έπρεπε να γίνει. Παρακαλούμε επικοινωνήστε μαζί μας");}
                   if (diff_date < 12)
		        {var Result = ("Ο εμβολιασμός πρεπε να γίνει.");}
           $("#ResultText").text(Result).hide().fadeIn(400);

 

και παίρνω διαφορετικό μήνυμα εάν οι μήνες είναι πάνω από 12 ή όχι.

 

Κάτι που δεν μπορώ όμως να κάνω είναι να υπολογίσω την νέα ημερομηνία εμβολίου.

demo3

 

Έκανα το εξής

>
               var diff_date = Math.round((foo_date2 - foo_date1)/months); 
               var new_date = Math.round(foo_date1 + 12); 
                   if (diff_date > 12)
		        {var Result = ("Παρακαλούμε επικοινωνήστε μαζί μας.Ο εμβολιασμός έπρεπε να γίνει " + new_date);}
                   if (diff_date < 12)
		        {var Result = ("Ο εμβολιασμός πρέπει να γίνει " + new_date);}

 

Δηλαδή πρόσθεσα το foo_date1 + 12, αλλά καταλαβαίνω οτι δεν είναι σωστό γιατί το foo_date1 είναι ημερομηνία και το 12 είναι αριθμός.

Άρα πως μπορούμε να κάνουμε αυτόν τον υπολογισμό?

Δημοσ.

αν του προσθέσεις 31104000000 ?

 

--edit-- άκυρο.. ενας χρόνος (365 μέρες) είναι 31536000000

 

Παραδόξως το 3110400.... είναι ενα tun (ενας χρόνος των Μάγιας.. 360μέρες)

Δημοσ.

Μπα

Σίγουρα θα υπάρχει κάποιος τρόπος

 

να μπορούμε σε μια ημερομηνία να προσθέσουμε 12 μήνες και να μας δώσει το αποτέλεσμα σε ημερομηνία πάλι.

Δημοσ.

Εννοείς αυτό?

>
               var new_date = Math.round(foo_date2 + 31536000000 ); 
                   if (diff_date > 12)
		        {var Result = ("Παρακαλούμε επικοινωνήστε μαζί μας.Ο εμβολιασμός έπρεπε να γίνει " + new_date);}
                   if (diff_date < 12)
		        {var Result = ("Ο εμβολιασμός πρεπεi να γίνει " + new_date);}
           $("#ResultText").text(Result).hide().fadeIn(400);

δηλαδή στη foo_date2 να προσθέσουμε τα 31536000000

οκ

αλλα σαν αποτελεσμα μου δίνει NaN

Δημοσ.

Έκανα μισό βήμα ακόμη

demo3

 

Πρόσθεσα

var new_date = new Date(this.form.date1.value); // Για να πάρω την ημερομηνία απο τη φόρμα

new_date.setMonth( new_date.getMonth() + 12 ); // Για να προσθεσω + 12 μήνες

 

 

Αποτέλεσμα για ημερομηνία 10/11/2008

 

Μήνυμα : Παρακαλούμε επικοινωνήστε μαζί μας.Ο εμβολιασμός έπρεπε να γίνει Sun Oct 11 2009 00:00:00 GMT+0300

 

εδώ τώρα εκτος απο τη διαφορετική μορφή της ημερομηνίας αλλάζει το μήνα με τη μέρα (μορφή M/d/y)

Δημοσ.

δεν θυμάμαι τώρα αν η js υποστηρίζει date formatting αλλά ένας χαζός τρόπος είναι ο παρακάτω

 

>
function getDateFormatted(new_date){ 	
var day = new_date.getDate(); 	
var month = new_date.getMonth() + 1; 	
var year = new_date.getFullYear(); 	
return day + "/" + month + "/" + year; 	
}

Δημοσ.

natural_sgf ευχαριστώ για τη βοήθεια

μια ερώτηση

το αποτέλεσμα της function που έδωσες το πέρνουμε πάλι με τη μεταβλητή new_date?

 

πχ

>             function getDateFormatted(   ){    
                   var day = new_date.getDate();   
                   var month = new_date.getMonth() + 1;    
                   var year = new_date.getFullYear();      
                   return day + "/" + month + "/" + year;  
               }
                   
                       if (diff_date > 12)
		            {var Result = ("Παρακαλούμε επικοινωνήστε μαζί μας.Ο εμβολιασμός έπρεπε να γίνει " + new_date);}
                       if (diff_date < 12)
		            {var Result = ("Ο εμβολιασμός πρεπεi να γίνει " + new_date);}
    

Δημοσ.
>                        
function getDateFormatted(new_date){    
	var day = new_date.getDate();   
	var month = new_date.getMonth() + 1;    
	var year = new_date.getFullYear();      
	return day + "/" + month + "/" + year;  
}
	
if (diff_date > 12)
	{var Result = ("Παρακαλούμε επικοινωνήστε μαζί μας.Ο εμβολιασμός έπρεπε να γίνει " + getDateFormatted(new_date));}
if (diff_date < 12)
	{var Result = ("Ο εμβολιασμός πρεπεi να γίνει " + getDateFormatted(new_date));}

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...