2010-04-17 3 views
11

È possibile che JavaScript calcoli un timestamp restituito dalla funzione PHP time() e lo presenti in un formato leggibile come "Dom, 18 aprile 2010 alle 16:00"?Data/ora leggibile da JavaScript()

risposta

25

Utilizzare il Date object per farlo:

new Date(<?php echo time(); ?>*1000) 

è necessario moltiplicare il timestamp Unix per 1000 becuase Date si aspetta che il timestamp di essere in millisecondi.

E per formattare la data, è possibile utilizzare questo Date.format method (Data non ha incorporato).

+0

Questo metodo Date.format è una manna dal cielo! Grazie mille :) – Lyon

+1

Invece di moltiplicare puoi aggiungere solo 3 zeri: var ora = nuova Data ( 000); –

2

Stai andando a voler fare molta attenzione a fare queste cose. Quando si assume un valore temporale sul lato server che è un tradizionale "numero di secondi (o millisecondi) dal valore di Epoch boundary" e poi lo si trasforma in una sorta di oggetto "Date", si verifica una traduzione nel fuso orario appropriato per la locale del contesto.

Il problema sorge quando hai un server che si trova a Chicago, e qualcuno alle Hawaii con il vostro sito, dicono che dopo una festa — uno di quegli affari "luau", senza dubbio, completo di maiale arrosto e l'erba-costeggiava ballerine, una rara serata sotto caldi cieli tropicali, fiori esotici che profumano le brezze dell'oceano — ed è tardi ora. Mio Dio, è quasi mezzanotte! Qualunque cosa penserà la madre quando la scriverò sulla festa?

Il nostro frequentatore delle feste si siede alle 23:30 per utilizzare il sito. Ora, ovviamente, essendo considerevolmente ad est delle Hawaii, il tuo server pensa che siano le 5:30 del mattino, e la data è un giorno più tardi della data in cui il nostro frequentatore di party annuncerà la sua breve nota alla mamma. Così il tuo server scrive il suo valore temporale in una pagina web come descritto nelle risposte qui, e — correttamente — l'ora locale delle Hawaii si presenta sulla pagina nella stanza d'albergo del nostro frequentatore di feste.

Il problema è questo: se questo locale tempo rende di nuovo alla vostra applicazione da qualche campo di modulo, e l'applicazione considera come ora locale a Chicago, allora il vostro sito sarà ottenere la data di ieri. A seconda dell'applicazione che è OK o non è OK - il punto è, è necessario tenere traccia di dove una data (espressa in notazione calendario ordinaria) viene da vis-a-vis dove la data è utilizzata.

Ovviamente si può avere il problema opposto. Cioè, se il tuo server esegue sempre le date nel suo fuso orario locale, gli utenti in altre parti del mondo vedranno confusi (apparentemente errati) valori di data e ora, quindi l'interfaccia deve chiarire cosa significano quei valori. I problemi diventano importanti quando il tuo sito offre servizi che prevedono orari. Se è possibile pianificare le operazioni, è importante che l'interfaccia mantenga le cose al livello in modo che "30 aprile alle 22:00" indichi data e ora sul server o la data e l'ora nella locale da cui la pianificazione è stato organizzato. Qualunque cosa sia, devi stare attento a mantenere le cose coerenti.

2

Invece di un timestamp numerico unix è anche possibile inviare una rappresentazione testuale della data che Date.parse() comprende.
Forse è solo il mio contributo al riscaldamento globale, ma penso che ci siano benefici nell'usare un formato più leggibile e contenente informazioni sul fuso orario.

ad es.

<?php 
// I have "decided" America/Los_Angeles fits most of my audience 
date_default_timezone_set('America/Los_Angeles'); 
$now = time(); 
$yesterday = strtotime('yesterday', $now); 
// March 27, 1976 08:00:00 tz:America/Los_Angeles 
$someotherdate = mktime(8, 0, 0, 3, 27, 1976) 
?><html> 
    <head><title>...</title> 
    <script type="text/javascript" src="jquery.min.js"></script> 
    <script type="text/javascript"> 
     function foo() { 
     $('.datetime').each(function() { 
      var t = $(this).text(); 
      t = new Date(Date.parse(t)).toLocaleString(); 
      $(this).text(t); 
     }); 
     } 
    </script> 
    </head> 
    <body> 
    <div><span class="datetime"><?php echo date(DateTime::RSS, $now); ?></span></div> 
    <div><span class="datetime"><?php echo date(DateTime::RSS, $yesterday); ?></span></div> 
    <div><span class="datetime"><?php echo date(DateTime::RSS, $someotherdate); ?></span></div> 
    <button onclick="foo()">to local time</button> 
    </body> 
</html> 

Questo stampa

Sat, 17 Apr 2010 04:40:15 -0700 
Fri, 16 Apr 2010 00:00:00 -0700 
Sat, 27 Mar 1976 08:00:00 -0800 

nel mio browser e (dato che il mio fuso orario locale è Europe/Berlin, CET, GMT + 1/2) dopo aver toccato il tasto to local time

Samstag, 17. April 2010 13:40:15 
Freitag, 16. April 2010 09:00:00 
Samstag, 27. März 1976 17:00:00 
+0

Sì, ma vedere la mia risposta. Se il server fornisce al Javascript un valore temporale che è stato formattato in base all'ora locale * sul server *, il client vedrà l'ora sul lato server. Questo può essere desiderato, o potrebbe non esserlo; dipende dall'applicazione e dal significato del valore temporale, in ogni caso questo approccio produrrebbe risultati diversi dall'approccio all'uso diretto del valore numerico. – Pointy

+0

@Pointy: Non sono sicuro di aver compreso la tua preoccupazione in questo caso. Ovviamente il valore dipende da ciò che l'orologio del server "pensa" è il tempo, cioè se l'orologio del server è sbagliato, anche il valore sarà sbagliato. Ma ho usato 'gmdate()' e 'DateTime :: W3C' come formato, cioè l'output appare come' 2010-04-17T11: 12: 22 + 00: 00' dove '+00: 00' indica il fuso orario (almeno l'offset). Date.parse() riconosce l'offset e tratta il valore di conseguenza. – VolkerK

+0

Ok bene, in quel caso avrebbe sicuramente lo stesso effetto dell'utilizzo del valore di tempo "grezzo" (il numero "numero di secondi"), quindi mi dispiace per non averlo visto. – Pointy

0

È ora il 2013 e man mano che sempre più persone passano dall'elaborazione dei risultati SQL sul lato PHP al passaggio dei risultati in JSON e all'elaborazione sul lato client, penso che moment.js meriti una certa attenzione per l'offerta di repla facile cementi alle funzioni strtotime() e date() di PHP in Javascript, oltre ad altre ancora.

Proprio includono:

<script src="SCRIPT_DIR/moment.min.js" type="text/javascript"></script> 

Allora è facile come:

// Simulates ajax response 
var data = { someDate: "2023-08-23 11:52:39" } 

// .unix() converts to Unix timestamp: 1692816759 
moment(data.someDate).unix(); 

// Displaying it in a readable format 
// Aug 23, 11:52 AM 
moment("2023-08-23 11:52:39").format('MMM D, hh:mm A'); 

// Now 
moment(); 

// Support for manipulation and chaining 
moment().add('days', 7).subtract('months', 1).hours(15).minutes(0).seconds(0); 

È possibile ottenere il file di 5,5 KB js qui:

http://momentjs.com/

Ulteriori documenti qui:

http://momentjs.com/docs/