J'appelle une API d'où j'obtiens la date /Date(1365004652303-0500)/
. Je ne comprends pas le format. Comment s'appelle ce format de date? Je ne savais pas quoi chercher sur ce type de format.
Quelqu'un peut-il m'aider à obtenir cette date au format Y-m-d H:i:s
?
L'API que j'appelle est sur le serveur .NET. Et quand je l'appelle en utilisant file_get_contents
et json_decode
de PHP, il me donne le format de date suivant pour la date de création: /Date(1365004652303-0500)/
Vous devez d'abord comprendre le format que vous avez
/Date(1365004652303-0500)/
Alors vous avez
Construire un format
$date = '/Date(1365004652303-0500)/';
preg_match('/(\d{10})(\d{3})([\+\-]\d{4})/', $date, $matches);
$dt = DateTime::createFromFormat("U.u.O",vsprintf('%2$s.%3$s.%4$s', $matches));
echo $dt->format('r');
Sortie
Wed, 03 Apr 2013 15:57:32 -0500
^
|= Can you see the GMT ?
interface DateFormatParser
{
/**
* @param $string
*
* @return DateTime
*/
public function parse($string);
}
abstract class PregDateParser implements DateFormatParser
{
protected $pattern, $format, $mask;
public function parse($string) {
$string = (string)$string;
$pattern = $this->pattern;
$format = $this->format;
$mask = $this->mask;
$r = preg_match($pattern, $string, $matches);
if (!$r) {
throw new UnexpectedValueException('Preg Regex Pattern failed.');
}
$buffer = vsprintf($mask, $matches);
$result = DateTime::createFromFormat($format, $buffer);
if (!$result) {
throw new UnexpectedValueException(sprintf('Failed To Create from Format "%s" for "%s".', $format, $buffer));
}
return $result;
}
}
class JsonTimestampWithOffsetParser extends PregDateParser
{
protected $pattern = '/^\/Date\((\d{10})(\d{3})([+-]\d{4})\)\/$/';
protected $format = 'U.u.O';
protected $mask = '%2$s.%3$s.%4$s';
}
$date = '/Date(1365004652303-0500)/';
$parser = new JsonTimestampWithOffsetParser;
$dt = $parser->parse($date);
echo $dt->format('r');
Essayez ceci:
var_dump(date('Y-m-d H:i:s', '1365004652303'/1000));
$str = '/Date(1365004652303-0500)/';
$match = preg_match('/\/Date\((\d+)([-+])(\d+)\)\//', $str, $date);
$timestamp = $date[1]/1000;
$operator = $date[2];
$hours = $date[3]*36; // Get the seconds
$datetime = new DateTime();
$datetime->setTimestamp($timestamp);
$datetime->modify($operator . $hours . ' seconds');
var_dump($datetime->format('Y-m-d H:i:s'));
Résultats:
string(19) "2013-04-03 17:57:32"
string(19) "2013-04-03 12:57:32"
Décomposons /Date(1365004652303-0500)/
en:
La première chaîne est assez claire.
Le prochain grand nombre est la valeur Epoch
Le -0500 représente le fuseau horaire dans lequel les dates ont été initialement stockées. Il est relatif à UTC et fait donc référence à l'heure normale de l'Est.
L'époque est avec une précision de mille secondes. Essayez ce code:
<?php
$str = "/Date(1365004652303-0500)/";
preg_match( "#/Date\((\d{10})\d{3}(.*?)\)/#", $str, $match );
echo date( "r", $match[1] );
?>
Vous pouvez également utiliser le fuseau horaire pour définir la date par rapport à la vôtre. http://codepad.viper-7.com/RrSkMy
Cet horodatage est en millisecondes, c'est pourquoi il est si grand.
Vous pouvez utiliser l'appel PHP date () pour formater cet horodatage à votre guise. Il suffit de diviser par 1 000 d’abord. En format américain standard, il serait
$ mydate = date ('m d Y', $ timestamp);
(où $ timestamp est 1365004652303)
Pour le formater dans le format que vous avez demandé (Y-m-d H: i: s), utilisez «Y-m-d H: i: s» comme chaîne de format (premier paramètre). Couper le texte commençant par "-".
$stamps = preg_split("/-/", $time);
$stamps[0] = $stamps[0]/1000;
$mydate = date('Y-m-d H:i:s', $stamps[0]);
Cela donne 2013-04-03 11:57:32
D'autres ont suggéré que 0500 est un décalage; Si tel est le cas, vous souhaiterez ajuster $ stamps [0] en conséquence.
Si votre date est comme /Date(-62135578800000)/
, un entier positif ou négatif sans fuseau horaire:
$date = substr('/Date(-62135578800000)/', 6, -5);
$date = date('m/d/Y H:i:s', $date + date('Z', $date) * -1);
// 01/01/0001 05:00:00
L'exemple suivant utilise les classes preg_match()
et DateTime
:
$date = '/Date(1365004652303-0500)/';
// get the timestamp
$pattern = '~/Date\(([0-9]*)~';
preg_match($pattern, $date, $matches);
$timestamp = round(((int) $matches[1]) / 1000);
$dt = new DateTime();
$dt->setTimestamp($timestamp);
echo $dt->format('Y-m-d H:i:s');
La réponse de Baba est très utile, mais elle ne couvre pas les 3 cas dont j'ai besoin:
C'est ce que j'utilise pour obtenir l'horodatage:
$date_string = '/Date(-594262800300+0100)/';
preg_match('/([+-]?\d+)([+-]\d{4})?/', $date_string, $matches);
$timestamp = $matches[1] / 1000;
$hours = $matches[2] * 36; // Get the seconds
return $timestamp + $hours;
De nouveau, comme Ghigo l’a noté, cela n’est pas correct si le décalage contient des minutes, mais cela fonctionne dans mon cas.
J'ai eu une expérience légèrement différente qui m'a amené à apporter quelques légères modifications à l'excellente réponse de Baba.
En utilisant la bibliothèque JSON de Newtonsoft pour coder les messages au format .NET, que j'envoie ensuite à notre site Web (la partie PHP), j'obtiens un espace avant le décalage du fuseau horaire et aucun caractère +/-.
J'ai également vu des nombres négatifs à partir de dates antérieures à la période, ce qui signifie que je devais prendre en charge le signe - avant la valeur en millisecondes.
J'ai modifié la regex à cela et cela fonctionne parfaitement pour moi:
^/Date(([-]?\d{10})(\d{3})\s?([+-]?\d{4}))/$
Les deux différences sont
[-]?
avant la valeur en millisecondes à 10 chiffres et \s?
avant le décalage du fuseau horaire.
Je mettrais cela comme un commentaire sur la réponse de Baba, mais mon manque de réputation ne me le permet pas. J'espère que cela me convient de poster ici car je pensais que cela pourrait être utile.