A common problem is to format dates and times for XML documents.
The XML standard is defined as follows:
"
To specify a time zone, you can either enter a dateTime in UTC time by adding a "Z" behind the time - like this:
<startdate>2002-05-30T09:30:10Z</startdate>
or you can specify an offset from the UTC time by adding a positive or negative time behind the time - like this:
<startdate>2002-05-30T09:30:10-06:00</startdate>
"
Here is a possible solution in PHP:
<?php
if(date_default_timezone_get() == 'UTC') {
$offsetString = 'Z'; // No need to calculate offset, as default timezone is already UTC
} else {
$phpTime = '2002-05-30 09:30:10';
$millis = strtotime($phpTime); // Convert time to milliseconds since 1970, using default timezone
$timezone = new DateTimeZone(date_default_timezone_get()); // Get default system timezone to create a new DateTimeZone object
$offset = $timezone->getOffset(new DateTime($phpTime)); // Offset in seconds to UTC
$offsetHours = round(abs($offset)/3600);
$offsetMinutes = round((abs($offset) - $offsetHours * 3600) / 60);
$offsetString = ($offset < 0 ? '-' : '+')
. ($offsetHours < 10 ? '0' : '') . $offsetHours
. ':'
. ($offsetMinutes < 10 ? '0' : '') . $offsetMinutes;
}
echo('<startdate>' . date('Y-m-d\TH:i:s', $millis) . $offsetString . '</startdate>'); // This is the correct XML format
?>
DateTimeZone::getOffset
timezone_offset_get
(PHP 5 >= 5.2.0)
DateTimeZone::getOffset -- timezone_offset_get — Retourne le décalage GMT d'un fuseau horaire
Description
Style orienté objet
Style procédural
timezone_offset_get() retourne le décalage horaire par
rapport au GMT pour le paramètre datetime. Le
décalage GMT est calculé à partir des informations de fuseau horaire
contenu dans l'objet DateTime.
Liste de paramètres
-
object -
Seulement en style procédural : un DateTimeZone objet retourné par timezone_open()
-
datetime -
Objet DateTime qui contient la date dont il faut calculer le décalage.
Valeurs de retour
Retourne le décalage horaire, exprimé en secondes, en cas de succès ou FALSE si une erreur survient.
Exemples
Exemple #1 Exemple avec DateTimeZone::getOffset()
<?php
// Crée deux objets fuseau horaire, un pour Taipei (Taiwan) et un pour
// Tokyo (Japon)
$dateTimeZoneTaipei = new DateTimeZone("Asia/Taipei");
$dateTimeZoneJapan = new DateTimeZone("Asia/Tokyo");
// Crée deux objets DateTime qui contiennent le même timestampe Unix,
// mais sont situés dans deux fuseaux horaires différents.
$dateTimeTaipei = new DateTime("now", $dateTimeZoneTaipei);
$dateTimeJapan = new DateTime("now", $dateTimeZoneJapan);
// Calcule le décalage horaire GMT pour l'objet $dateTimeTaipei
// mais en utilisant le fuseau horaire de Tokyo
// ($dateTimeZoneJapan).
$timeOffset = $dateTimeZoneJapan->getOffset($dateTimeTaipei);
// Devrait afficher int(32400) (pour les dates après le Sat Sep 8 01:00:00 1951 JST).
var_dump($timeOffset);
?>
skanzow at gmx dot net
08-Sep-2011 03:55
