Baba: toLocalString()

Hallo allerseits.

Es geht um die Zeitausgabe auf einer mehrsprachigen Seite bei der per JS ein Timestamp in die lokale Zeit umgewandelt wird, mit einem Fallback für die UTC-Zeit.

Z.B schreibe ich das Datum der letzten Änderung auf jede Page, mit:

<div id="lastupdate">Last update: <span class='usertimestamp' data-time='1370961211000' data-lang='en'>Tuesday, 11 June 2013 16:33 (UTC+2)</span></div>

"Last update:" ist dynamisch, je nach eingestellter Sprache. Ebenso die Fallback-UTC-Zeit wird je nach eingestellter Sprache ausgegeben.

Mit dieser Funktion übersetze ich diesen Timestamp zu der lokalen Uhrzeit:

$(function(){  
  
  $("span.usertimestamp").each(function(){  
  
    var b2UserDate = new Date(parseInt($(this).attr("data-time")));  
    var b2UserLang = $(this).attr("data-lang");  
    $(this).html(b2UserDate.toLocaleString());  
  
  });  
  
});

Das Problem nun: ich bekomme immer das Deutsche Datum, auch wenn ich die Seite auf Englisch laufen habe:

Last update: Dienstag, 11. Juni 2013 16:33:31

Kann ich das irgendwie umstellen oder nimmt JS das ausschliesslich vom OS?

PS: warum wird bei diesem Forum eigentlich immer um JS-Code eine (schöne) Box gezeichnet, mit abgesetztem Hintergrund, nicht aber um HTML-Code? KÖnnte man das einheitlich machen?

Cheers,
Baba

  1. hi,

    PS: warum wird bei diesem Forum eigentlich immer um JS-Code eine (schöne) Box gezeichnet, mit abgesetztem Hintergrund, nicht aber um HTML-Code? KÖnnte man das einheitlich machen?

      
    syntaxHighlightingTest = foo;  
    
    
      
    <p class="test">syntaxHighlightingTest</p>  
    
    

    mfg

    tami

  2. Tach!

    PS: warum wird bei diesem Forum eigentlich immer um JS-Code eine (schöne) Box gezeichnet, mit abgesetztem Hintergrund, nicht aber um HTML-Code? KÖnnte man das einheitlich machen?

    Eine Zeile vs. mehrere Zeilen. Die Code-Art ist nicht relevant. Es soll nicht jedes ausgezeichnete Inline-Code-Fitzelchen geboxt werden.

    dedlfix.

    1. Die Code-Art ist nicht relevant. Es soll nicht jedes ausgezeichnete Inline-Code-Fitzelchen geboxt werden.

      Ah, I see...
      Danke.
      Cheers,
      Baba

  3. Es geht um die Zeitausgabe auf einer mehrsprachigen Seite

    Frage 1: Wann und wo wird denn die Sprache (an der - was falsch ist, offenbar die Zeitzone fest machen willst) fest gelegt. Üblicherweise geschieht das doch noch serverseitig.

    bei der per JS ein Timestamp in die lokale Zeit umgewandelt wird, mit einem Fallback für die UTC-Zeit.

    Frage 2:
    Wieso willst Du dann da mit Javascript drüber?

    Frage 3:
    Wieso und wozu willst Du die lokale Zeit des Benutzers angeben? Und woher willst Du wissen, wo der sich gerade befindet? Zum Beispiel haben Russland und die USA mehrere Zeitzonen...

    Jörg Reinholz

    1. Frage 2:
      Wieso willst Du dann da mit Javascript drüber?

      Naja, weil er den Änderungszeitpunkt der Seite in der Clientseitig eingestellten Zeitzone ausgeben will und nicht in der des Servers in Honolulu, weil das der Besucher der Seite gar nicht wissen kann.

      Und woher willst Du wissen, wo der sich gerade befindet? Zum Beispiel haben Russland und die USA mehrere Zeitzonen...

      Das ist ja in den Localeeinstellungen des Systems hinterlegt.

      1. Frage 2:
        Wieso willst Du dann da mit Javascript drüber?
        Naja, weil er den Änderungszeitpunkt der Seite in der Clientseitig eingestellten Zeitzone ausgeben will

        Wow! Ok. Warum übergibt er dann nicht den dann nicht gleich als date-Objekt?

        Beispielsweise sollte etwas in der Art funktionieren:

        <script type text/css>
        oDate = <http://de.selfhtml.org/javascript/objekte/date.htm#allgemeines@title=new Date>(<?php echo date('Y,m,d,H,i,s', filemtime(FILE)); ?>);
        ...
        </script>

        Jörg Reinholz

        1. Wow! Ok. Warum übergibt er dann nicht den dann nicht gleich als date-Objekt?

          Weils extrem schwer wartbar ist, wenn man Javascript-Code mit PHP generiert.

          1. Weils extrem schwer wartbar ist, wenn man Javascript-Code mit PHP generiert.

            Das war ja nur ein Beispiel. Wie willst Du denn das letzte Datum der Änderung an den Client übermitteln? Etwa manuell eintragen?

            Die wahrscheinlich verwendete Sprache lässt sich übrigens mit navigator.language / navigator.browserLanguage(nur IE)  / navigator.systemLanguage (nur IE) / navigator.userLanguage (nur IE) oder ajax herausfinden.

            Jetzt muss man nur noch herausfinden zu welcher Sprache welches Datumsformat gehört (mir fallen aus dem Stegreif mindestens die englische, französische, deutsche und die ISO- Notation ein), welche der obigen Angaben man denn gerne hätte und ob der Browser diese liefert. Zu dem braucht es ein fallback, falls die Angabe manipuliert wurde und(deshalb)/oder eine Sprache zurückgeliefert wird, die unberücksichtigt blieb oder unbekannt ist. Ist die Webseite mehrsprachig vielleicht auch noch die vom Nutzer direkt gewählte Sprache aus dem Cookie (oder woher auch immer).

            Das sieht nach viel Arbeit aus. Ich würde ja dazu neigen den Zeitpunkt kurzerhand in UTC und im ISO-Format angeben. 2013-06-12 09:40 GMT versteht inzwischen wohl jeder.

            Jörg Reinholz

            1. Das war ja nur ein Beispiel. Wie willst Du denn das letzte Datum der Änderung an den Client übermitteln? Etwa manuell eintragen?

              Wie ich den OP verstanden habe, ist der Teil des Problems bereits gelöst. Er geniert ein span-Element, dass die erforderlichen Daten in custom-data-Attributen speichert.

              <div id="lastupdate">Last update: <span class='usertimestamp' data-time='1370961211000' data-lang='en'>Tuesday, 11 June 2013 16:33 (UTC+2)</span></div>

              "Last update:" ist dynamisch, je nach eingestellter Sprache. Ebenso die Fallback-UTC-Zeit wird je nach eingestellter Sprache ausgegeben.

            2. Hallo,

              Die wahrscheinlich verwendete Sprache lässt sich übrigens mit navigator.language [...] herausfinden.

              nein, damit bekommst du nur die "Installationssprache" des Browsers, die mit den Sprachpräferenzen des Nutzers nicht unbedingt etwas zu tun haben muss. Viele Nutzer installieren die englische Version ihres Lieblingsbrowsers, möchten Webseiten dann aber dennoch in ihrer Landessprache bzw. einer anderen genehmen Sprache sehen.
              Will man die herausfinden, muss man anscheinend wirklich erst einen Request rausfeuern und ein serverseitiges Script aufrufen, das den Request-Header "Accept-Language" liest und als Payload zurückschickt - so wie es die Ajax-Methode macht, die du ebenfalls mit verlinkt hast.

              Jetzt muss man nur noch herausfinden zu welcher Sprache welches Datumsformat gehört (mir fallen aus dem Stegreif mindestens die englische, französische, deutsche und die ISO- Notation ein)

              Ist die französische denn anders als die deutsche? - In der ausgeschriebenen Form natürlich, wegen der Monatsnamen in französischer Sprache. Aber die übliche Kurzform DD.MM.YYYY ist AFAIK gleich wie bei uns, soweit ich eben auf die Schnelle herausfinden konnte.
              Gut, das Trennzeichen mag variieren, aber das tut es bei uns ja auch: Die meisten schreiben das Datum im Deutschen mit dem Punkt als Trennzeichen, manche mit einem Bindestrich, und sogar den Schrägstrich sieht man gelegentlich als Trennzeichen - wenn auch in DE sehr selten.

              Das sieht nach viel Arbeit aus. Ich würde ja dazu neigen den Zeitpunkt kurzerhand in UTC und im ISO-Format angeben. 2013-06-12 09:40 GMT versteht inzwischen wohl jeder.

              Zumindest jeder, der sich dafür interessiert.

              Ciao,
               Martin

              --
              Wer morgens zerknittert aufsteht, hat den ganzen Tag Gelegenheit, sich zu entfalten.
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        2. Wieso willst Du dann da mit Javascript drüber?
          Naja, weil er den Änderungszeitpunkt der Seite in der Clientseitig eingestellten Zeitzone ausgeben will

          Wow!

          Ja, nicht? :)

          Ok. Warum übergibt er dann nicht den dann nicht gleich als date-Objekt?

          Weil ich dann nicht verlässlich an die Zeitzone des Users rankomme. Hintergrund ist übrigens eine Seite, die hauptsächlich in Deutschland und Australien benutzt wird. Da die letzte Änderung der Seite sehr wichtig sein kann will ich den Usern in Melbourne nicht zumuten die GMT-Zeit umzurechnen ("Hat er jetzt schon das update gemacht???"). Da ich den Unixtimestamp zum User sende, der unabhängig von jeder Zeitzone ist, und der übersetzt wird mit der Usereinstellung, habe ich, was ich will. Die serverseitige GMT-Angabe ist der Fallback, bei Deaktiviertem Javscript.

          Cheers,
          Baba

      2. Naja, weil er den Änderungszeitpunkt der Seite in der Clientseitig eingestellten Zeitzone ausgeben will und nicht in der des Servers in Honolulu, weil das der Besucher der Seite gar nicht wissen kann.

        Exakt. Danke für den Beschrieb, den ich leider vergaß. Ich tue dies übrigens im Ergebnis eines Threads von mir vor etlichen Monaten hier.

        Cheers,
        Baba

  4. Kann ich das irgendwie umstellen oder nimmt JS das ausschliesslich vom OS?

    Du kannst einen language-Tag als ersten Parameter übergeben.
    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString

    1. Du kannst einen language-Tag als ersten Parameter übergeben.
      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString

      Great, great, great!

      Vielen Dank, diese Information will http://de.selfhtml.org/javascript/objekte/date.htm#to_locale_string@title=hier noch hinzugefügt werden. (Ich weiß, Ihr seht das nicht mehr als Referenz, aber da hätte ich es gefunden :)

      Cheers,
      Baba

    2. Du kannst einen language-Tag als ersten Parameter übergeben.
      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString

      Hm, schaffe es nicht. Dies ist ein leicht modifiziertes Beispiel. Ich sehe stets: Freitag, 12. Juli 2013 14:00:00.

      Cheers,
      Baba

      1. Hm, schaffe es nicht. Dies ist ein leicht modifiziertes Beispiel. Ich sehe stets: Freitag, 12. Juli 2013 14:00:00.

        Ich sehe (Chrome 27): 7/12/2013 2:00:00 PM

        1. Ich sehe (Chrome 27)

          Jetzt sehe ich den compatibility check! Das dauert wohl noch etwas, bis man sich darauf verlassen kann.

          Cheers,
          Baba

      2. Hm, schaffe es nicht. Dies ist ein leicht modifiziertes Beispiel. Ich sehe stets: Freitag, 12. Juli 2013 14:00:00.

        Ich sehe dort:
        "Fr 12 Jul 2013 14:00:00 CEST". (Firefox 21)
        "Friday July 12, 14:00:00 GMT+0200 2013" (Opera 12.15)
        "7/12/2013 2:00:00 PM" (Chromium 25)

        Übergeben hast Du:

        var date = new Date(Date.UTC(2013, 06, 12, 12, 0, 0));

        Die Zeit wurde also korrekt um zwei Stunden nach Osten (CEST = +02:00) verschoben. Gib den Monat beginnend mit 0 (=Januar) an, dann klappt es.

        Versuch von mir:

        $("#result").html(date.toLocaleString("de-DE"));

        Was nur im Chromium klappt ist die Sprache, respektive des Format. Da aber ausgerechnet dieser für die anglophonen die verkorkste Ausgabe "7/12/2013 2:00:00 PM" liefert finde ich es gut, dass ausgerechnet der das teutogermanische Datumsformat dann korrekt anwendet und "12.7.2013 14:00:00"  angibt.

        Fazit: Geht doch!

        Jörg Reinholz