• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dziwne zachowanie getTime()

Object Storage Arubacloud
+1 głos
242 wizyt
pytanie zadane 10 lutego 2022 w JavaScript przez Pieselosek Nowicjusz (160 p.)

Dzień dobry.

Mam zadanie aby sprawdzić która osoba jest starsza bazując na ich dacie urodzenia. Chciałem użyć metody getTime ale daje ona wyniki bez sensu. Data 02/02/2005 zwraca więcej ms niz 02/02/2000. W funkcji zadanie 1 wszystko działa jak powinno.

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>



</head>
<body style="background-color: grey;">
    
<script type="text/javascript">

    function zadanie1()
    {
        var data =  new Date;
        var ileteraz = data.getTime();
        var urodzenie = new Date(prompt("Podaj date urodzenia mm/dd/yyyy")); // data urodzin do wpisania
        var ileurodzenie = urodzenie.getTime();
        var upływCzasu = ileteraz-ileurodzenie;
        var dni = Math.floor(upływCzasu / (1000 * 3600 * 24));
        if ( dni >= (18*365) )
        {
            alert("Jesteś pełnoletni");
        } else {
           alert("Jesteś niepełnoletni");
        }
    }
    


    function zadanie2()
    {

        // var data1 = new Date( prompt( ("Podaj pierwszą date urodzenia mm/dd/yyyy") ) );

        // var data2 = new Date( prompt( ("Podaj drugą date urodzenia mm/dd/yyyy") ) );    

        var data1 = new Date( "02/02/2005");

        var data2 = new Date( "02/02/2000" );    

        console.log (data1.getTime() );

        console.log(data2.getTime() );


        if (data1.getTime() < data2.getTime())
        {
            alert("Druga osoba jest starsza");
        }

        if (data1.getTime() > data2.getTime())
        {
            alert("Pierwsza osoba jest starsza");
        }
       
        if (data1.getTime() == data2.getTime())
        {
            alert("Osoby są w tym samym wieku");
        }
    }

</script>




<button onclick="zadanie1()">Kliknij aby sprawdzić czy jesteś pełnoletni (z1) </button>
<br>
<button onclick="zadanie2()">Kliknij aby sprawdzić która osoba jest starsza (z2) </button>

    
</body>
</html>


1
komentarz 11 lutego 2022 przez VBService Ekspert (253,340 p.)
edycja 11 lutego 2022 przez VBService

smiley

Data wpisu: 02.10.2022 (mm/dd/yyyy) czyli pełnoletnia: 02/10/2004 

 

granica błędu ok. 6 dni: 02/10/2004  - 02/15/2004  

function zadanie1()
{
  // data urodzin do wpisania
  var urodzenie = (new Date(prompt('Podaj date urodzenia mm/dd/yyyy'))).getTime(); 
  var lat = (Date.now() - urodzenie) / (1000 * 3600 * 24 * 365);
  alert('Jesteś ' + ((lat >= 18) ? '' : 'nie') + 'pełnoletni');
}

 

granica błędu ok. 3 dni: 02/10/2004  - 02/12/2004

function zadanie1()
{
  // data urodzin do wpisania
  var urodzenie = (new Date(prompt('Podaj date urodzenia mm/dd/yyyy'))).getTime(); 
  var lat = (Date.now() - urodzenie) / (1000 * 3600 * 24 * 365);
  alert('Jesteś ' + ((lat >= 18.01) ? '' : 'nie') + 'pełnoletni');
}

 

1 odpowiedź

+2 głosów
odpowiedź 11 lutego 2022 przez VBService Ekspert (253,340 p.)
wybrane 14 lutego 2022 przez Pieselosek
 
Najlepsza

getTime ale daje ona wyniki bez sensu. Data 02/02/2005 zwraca więcej ms niz 02/02/2000

getTime działa prawidłowo, ponieważ zwraca ilość milisekund jakie "upłynęły" od 01.01.1970 roku (ECMAScript epoch) do podanej daty. Czyli osoba z teoretycznie "mniejszą" datą ma wartość w milisekundach większą, bo data tej osoby jest bardziej "oddalona" od ECMAScript epoch. Potrzebujesz "odwrócić" sytuację i pobrać dodatkowo wartość "graniczą" z np.: Date.now()

To jest to co zrobiłeś w zadaniu 1

var upływCzasu = ileteraz-ileurodzenie;

 

 

przykład

function zadanie2()
{
  // var data1 = (new Date(prompt('Podaj pierwszą date urodzenia mm/dd/yyyy'))).getTime();
  // var data2 = (new Date(prompt('Podaj drugą date urodzenia mm/dd/yyyy'))).getTime();    

  const test = [
    { 'osoba1':'02/02/2000', 'osoba2':'02/02/2005' },
    { 'osoba1':'02/02/2005', 'osoba2':'02/02/2000' },
    { 'osoba1':'02/02/2005', 'osoba2':'02/02/2005' }
  ];

  for (let row of test) {
    const data1 = Date.now() - (new Date(row.osoba1)).getTime(),
          data2 = Date.now() - (new Date(row.osoba2)).getTime();

    console.log(data1, data2);

    if (data1 == data2)
      alert("Osoby są w tym samym wieku");            
    else
      alert(((data1 > data2) ? 'Pierwsza' : 'Druga') + ' osoba jest starsza');       
  }           
}

 

komentarz 14 lutego 2022 przez Pieselosek Nowicjusz (160 p.)
Rzeczywiście źle pomyślałem :p

Podobne pytania

0 głosów
1 odpowiedź 150 wizyt
pytanie zadane 28 października 2017 w JavaScript przez Filip31411 Dyskutant (8,820 p.)
0 głosów
0 odpowiedzi 181 wizyt
0 głosów
2 odpowiedzi 278 wizyt
pytanie zadane 1 lutego 2019 w JavaScript przez Bakr Mądrala (6,850 p.)

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...