Avatar billede steen_hansen Forsker
09. marts 2023 - 06:28 Der er 11 kommentarer og
1 løsning

Vis klokken fra alle tidszoner

Jeg har oprettet en database i MySQL, hvor jeg har indtastet alle landekoder for alle lande. Cuba har landekode +53, Georgien har +72 osv.

Jeg vil gerne have vist den nøjagtige tid vist på f.eks. Melbourne, Australien på en kollega’s profilside, hvilken har valgt en countrycode for Australien, samt et indtastet et australsk telefonnummer. Telefonnummeret bliver angivet af brugeren.

Men jeg vil også gerne have, at man ikke bare ukritisk ringer den pågældende kollega op onsdag den 14. klokken 15 dansk tid, hvor klokken er 01 torsdag den 15. i Melbourne, Australien (de er 10 timer foran os lige i øjeblikket).

Jeg har et javascript, som viser den nøjagtige tid i det land, som man befinder sig i. Jeg mener at have forstået det sådan, at det er ”ut”, som finder det præcise klokkeslet:

var tick;
    function stop() {
    clearTimeout(tick);
  }
function clock() {
    var ut=new Date();
    var h,m,s;
    var time="        ";
    h=ut.getHours();
    m=ut.getMinutes();
    s=ut.getSeconds();
        if(s<=9) s="0"+s;
        if(m<=9) m="0"+m;
        if(h<=9) h="0"+h;
        time+=h+":"+m+":"+s;
    document.getElementById('clock').innerHTML=time;
    tick=setTimeout("clock()",1000);
    }

Dette javascript viser timer, minutter og sekunder løbende, ganske som et almindeligt ur med sekundviser. Befinder jeg mig i Danmark, viser uret den danske tid. Befinder jeg mig på Cuba, viser det den cubanske tid osv. Det script er testet OK. Men det viser KUN tiden fra den tidszone, som du befinder dig i.

Min tanke er, om man kan benytte dette script til at vise lokal tid i Melbourne Australien, forstået på den måde, at man kan hente tiden ind v.hj.a. en værdi (GMT/UT/UTC …?) i MySQL? Og kan man i det hele taget blande en værdi fra MySQL ind i et javascript? Og ikke mindst, hvad med sommertid vs normaltid? Danmark og mange andre lande benytter DST (Daylight Savings Time, eller sommertid), mange andre gør ikke

Jeg ved ikke, om der findes nogen universelle værdier, som kan indsættes i -og hentes fra en MySQL database.

For at koge alt dette ned vil jeg gerne have vist dette på kollegaens profilside, baseret på brugerens landekode (jeg vil indtaste alle tidszoner i en relationsdatabase, som hører til den pågældende landekode, flere lande har flere tidszoner):

Klokken i Danmark er 15:01:14
Klokken i Melbourne, Australien er 01:01:14
Melbourne, Australien er 10 timer foran Danmark

eller

Klokken i Danmark er 15:01:14
Klokken i New York City, New York er 09:01:14
New York City, New York er 6 timer bagefter Danmark

- hvor der også er taget højde for sommertid/normaltid landene imellem
Avatar billede steen_hansen Forsker
09. marts 2023 - 06:34 #1
PS:

clock.js:

var tick;
    function stop() {
    clearTimeout(tick);
  }
function clock() {
    var ut=new Date();
    var h,m,s;
    var time="        ";
    h=ut.getHours();
    m=ut.getMinutes();
    s=ut.getSeconds();
        if(s<=9) s="0"+s;
        if(m<=9) m="0"+m;
        if(h<=9) h="0"+h;
        time+=h+":"+m+":"+s;
    document.getElementById('clock').innerHTML=time;
    tick=setTimeout("clock()",1000);
    }

HTML side:

<head>
<script src="/includes/js/clock.js"></script>
</head>
<body onload="clock();" unonload="stop();">
    <span id="clock"></span>
</body>

Viser klokken fra den tidszone, som du befinder dig i.
Avatar billede steen_hansen Forsker
09. marts 2023 - 06:48 #2
Jeg læser lige nu, at skift til sommertid foregår på forskellige datoer Verden over.

F.eks. i New York skifter man til sommertid tidligere end i Danmark, så tidsforskellen er 5 timer, når de skifter, og 6 timer igen, når vi skifter til sommertid.

I New York skifter man tilbage til normaltid tidligere end vi gør.

Så jeg håber der findes nogle universelle værdier, som man bare trække fra eller lægge til hinanden, som f.eks.

NYtime = UTC-6 (ved normaltid)
NYtime = UTC-5 (ved sommertid)

Fra mit synspunkt, ser det meget kompliceret og langhåret ud. Jeg håber der findes en simpel metode, eller nogen værdier fra en eller anden tidsserver man kan hente.
Avatar billede steen_hansen Forsker
09. marts 2023 - 07:09 #3
Måske er dette noget jeg kan indtaste, og hive ud fra MySQL og over javascriptet?

https://en.wikipedia.org/wiki/List_of_time_zones_by_country
Avatar billede madklub Guru
09. marts 2023 - 09:53 #4
Tidszoner er enhver programmørs mareridt:
https://youtu.be/-5wpm-gesOY
Avatar billede Slettet bruger
09. marts 2023 - 13:59 #5
Ja, det er muligt at hente tidszoneinformation fra en MySQL-database og bruge den til at vise den lokale tid i forskellige tidszoner i JavaScript.

Først skal du have en liste over tidszoner og deres forskellige offset-værdier, som du kan gemme i en MySQL-database. Du kan bruge en tredjeparts-API som for eksempel TimezoneDB eller Google Time Zone API for at hente disse oplysninger.

Når du har fået fat i offset-værdierne, kan du bruge dem til at beregne den lokale tid i forskellige tidszoner. Her er et eksempel på, hvordan du kan gøre det:

function getLocalTime(offset) {
  var d = new Date();
  var localTime = d.getTime();
  var localOffset = d.getTimezoneOffset() * 60000;
  var utc = localTime + localOffset;
  var localTimezoneOffset = offset * 3600000;
  var localTime = utc + localTimezoneOffset;
  return new Date(localTime);
}


Denne funktion tager et offset som parameter og returnerer den lokale tid i den pågældende tidszone. Du kan bruge den til at vise den lokale tid i forskellige tidszoner:

var melbourneOffset = 10;
var melbourneTime = getLocalTime(melbourneOffset);
document.getElementById('melbourne-time').innerHTML = melbourneTime.toLocaleTimeString();


Dette eksempel viser den lokale tid i Melbourne, Australien, baseret på et offset på 10 timer. Du kan gentage denne proces for andre tidszoner og vise den lokale tid på din kollegas profilside.

Når det kommer til at tage højde for sommertid/normaltid, kan du bruge et bibliotek som Moment.js, som håndterer tid og tidszoner på en mere avanceret måde end standard JavaScript. Moment.js kan automatisk justere for sommertid og normaltid baseret på tidspunktet på året og tidszonen.
Avatar billede Slettet bruger
09. marts 2023 - 14:01 #6
Held og lykke med den.

Jeg hopper af her. 👍
Avatar billede steen_hansen Forsker
10. marts 2023 - 14:28 #7
@Jørgen B. Jeg takker foreløbigt mange gange. Jeg kigger på det :)
Avatar billede steen_hansen Forsker
11. marts 2023 - 16:39 #8
@Jørgen B. Hvis du skulle læse dette, så har jeg hentet og importeret country og time_zone fra TimezoneDB, og jeg har også hentet moment.js og moment-with-locales.js

Men jeg aner ikke hvordan jeg bruger det i praksis.

Jeg kører alle country_code og country_name igennem en løkke i en select

Jeg går ud fra, at jeg skal hente alle country_code fra timezone, som er lig med country_code fra country:

country:
country_code, countryname

timezone:
zonename, country_code, abbreviation, time_start, gmt_offset, dst

Men når jeg sammenholder country\country_code med timezone\country_code, er der ikke meget, der stemmer overens. Jeg går ud fra, at der er noget relation mellem de 2 tabeller. Men jeg kan ikke se det.

Når jeg har fundet ud af at lave en brugbar SQL, så er næste step at hive de værdier <%=RS("zonename")%> osv ind i det javascript

Og function getLocalTime(offset) skal vel også onloades, når man går ind profilsiden, går jeg ud fra?

<head>
    <script src="/includes/js/offset.js"></script>
</head>

<body onload="function getLocalTime(offset)")>
    <span id="getLocalTime(offset)></span>
</body>

At begynde at bruge moment.js og/eller moment-with-locales.js sammen med TimezoneDB endnu, tør jeg slet ikke tænke på.

Jeg håber du har tid og lyst til at hjælpe mig igennem det her
Avatar billede steen_hansen Forsker
16. marts 2023 - 19:40 #9
@Jørgen B Jeg fik slet ikke løst min opgave ved hjælp af dit indlæg, jeg er stadig lige vidt. Men jeg takker for indsatsen, og fordi du oplyste om det. Jeg opretter et nyt spørgsmål baseret på dit indlæg.
Avatar billede Slettet bruger
16. marts 2023 - 20:37 #10
For at vise klokkeslættet for en bestemt tidszone på en hjemmeside, kan du bruge JavaScript's Date-objekt og dens metoder til at konvertere datoen og tiden til en bestemt tidszone. For at gøre dette skal du først hente den nuværende dato og tid fra brugerens browser. Dette kan gøres med new Date(). Derefter kan du bruge metoder som getUTCDate(), getUTCHours(), getUTCMinutes(), getUTCSeconds() og getUTCMilliseconds() til at hente UTC-værdierne for datoen og tiden.

Når du har UTC-værdierne, kan du bruge getTimezoneOffset()-metoden til at hente tidsforskellen mellem brugerens lokale tidszone og den ønskede tidszone. Du kan derefter bruge denne tidsforskel til at justere UTC-værdierne og få det korrekte klokkeslæt for den ønskede tidszone.

For at håndtere forskellen mellem sommertid og normaltid, kan du bruge en tidszone database som f.eks. TimezoneDB. Du kan bruge API'et til at hente den aktuelle tidszone og dens sommertids- og normaltidsinformation for en given placering.

For at blande MySQL-værdier i JavaScript kan du bruge AJAX-anmodninger til at hente data fra MySQL-databasen. Du kan bruge PHP eller andre server-side sprog til at oprette en API, som din JavaScript kan anmode om data fra.

Her er et eksempel på, hvordan du kan vise klokkeslættet for en bestemt tidszone på en hjemmeside:


java script:

function getTimeInTimeZone(timezone) {
  var now = new Date();
  var utcDate = Date.UTC(
    now.getUTCFullYear(),
    now.getUTCMonth(),
    now.getUTCDate(),
    now.getUTCHours(),
    now.getUTCMinutes(),
    now.getUTCSeconds(),
    now.getUTCMilliseconds()
  );

  // Get timezone offset in minutes
  var offset = -1 * (new Date().getTimezoneOffset());

  // Get DST offset for timezone
  var dstOffset = getDstOffset(timezone);

  // Calculate total offset
  var totalOffset = offset + dstOffset;

  // Calculate the time in the timezone
  var localDate = new Date(utcDate + totalOffset * 60 * 1000);

  // Format the time as a string
  var hours = localDate.getHours();
  var minutes = localDate.getMinutes();
  var seconds = localDate.getSeconds();
  var formattedTime = timezone + ': ' + hours + ':' + minutes + ':' + seconds;

  return formattedTime;
}

function getDstOffset(timezone) {
  // Use AJAX to fetch DST information for timezone from database/API
  // Calculate and return DST offset
}

// Example usage
var melbourneTime = getTimeInTimeZone('Australia/Melbourne');
var newYorkTime = getTimeInTimeZone('America/New_York');
console.log(melbourneTime);
console.log(newYorkTime);



Bemærk, at dette er et eksempel og ikke er komplet kode. Du skal stadig implementere funktionen getDstOffset() og håndtere AJAX-anmodninger til MySQL-databasen.
Avatar billede Slettet bruger
16. marts 2023 - 20:38 #11
Beklager, igen som skrevet, jeg hopper af tråden og jeg fulgte ikke med.

Skal til at spille 🙃👍
Avatar billede Slettet bruger
16. marts 2023 - 20:48 #12
Hej Steen,

Før jeg begynder med at spille, kan måske dette her hjælpe dig lidt, baseret lidt trin for trin.

Det er godt at høre, at du har fået hentet og importeret de nødvendige biblioteker og data, men det kan være svært at se, hvordan man skal bruge dem i praksis, når man først har dem.

For at forbinde de to tabeller, 'country' og 'timezone', kan du bruge en JOIN-sætning i din SQL-forespørgsel. Du kan bruge 'country_code' til at forbinde de to tabeller, sådan som du nævnte. Din SQL-forespørgsel kan se sådan ud:


vbnet:

SELECT zonename, abbreviation, time_start, gmt_offset, dst
FROM timezone
JOIN country ON timezone.country_code = country.country_code
WHERE country.country_name = 'LANDNAVN';


Erstat "LANDNAVN" med det landnavn, du vil have tidspunkterne for. Denne SQL-forespørgsel vil give dig alle tidspunkterne for det angivne land.




Når du har disse værdier, kan du bruge Moment.js til at formatere og manipulere datoer og tidspunkter. Først skal du inkludere biblioteket i din HTML-fil, ved hjælp af følgende kode:


php:

<script src="https://cdn.jsdelivr.net/momentjs/2.24.0/moment.min.js"></script>
Denne kode inkluderer Moment.js-version 2.24.0 fra CDNJS. Hvis du vil have en anden version, skal du finde URL'en til den ønskede version og erstatte den i koden ovenfor.



For at få den lokale tid skal du bruge din offset.js-fil og den funktion, du har oprettet i den. Du kan inkludere filen og funktionen i din HTML-fil ved hjælp af følgende kode:


php:

Copy code<script src="/includes/js/offset.js"></script>
<script>
  function getLocalTime(offset) {
    var now = moment().utcOffset(offset);
    document.getElementById("getLocalTime").innerHTML = now.format('dddd, MMMM Do YYYY, h:mm:ss a');
  }
</script>

Denne kode inkluderer offset.js-filen og din getLocalTime-funktion i HTML-filen og kalder funktionen ved indlæsning af siden ved hjælp af onload-attributten på body-elementet. Det betyder, at funktionen vil blive kaldt, når siden er færdig indlæst.




Endelig skal du inkludere en HTML-element, hvor den lokale tid vil blive vist. Du kan bruge følgende kode til dette:


php:

<body onload="getLocalTime(4)">
  <span id="getLocalTime"></span>
</body>


Dette kode vil kalde getLocalTime-funktionen ved indlæsning af siden og passere din tidszone-offset som en parameter. Det vil også oprette et HTML-element med id "getLocalTime", hvor den lokale tid vil blive vist.

Jeg håber, at disse trin hjælper dig med at komme i gang med at bruge Moment.js og TimezoneDB. Hvis du har flere spørgsmål, er du velkommen til at spørge mig.


Like for at angive, at du har flere spørgsmål, ellers må jeg kigge efter den nye tråde.
Bare giv kommentar, hvor du fortsætter når du har lukket denne tråde. 🤪
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester