Вычисление разниц во временной зоне [дубликат]

Единственный * означает, что может быть любое количество дополнительных позиционных аргументов. foo() можно вызвать, например foo(1,2,3,4,5). В теле foo () param2 представляет собой последовательность, содержащую 2-5.

Двойной ** означает, что может быть любое количество дополнительных именованных параметров. bar() можно вызвать, например bar(1, a=2, b=3). В теле bar () param2 - это словарь, содержащий {'a': 2, 'b': 3}

Со следующим кодом:

def foo(param1, *param2):
    print param1
    print param2

def bar(param1, **param2):
    print param1
    print param2

foo(1,2,3,4,5)
bar(1,a=2,b=3)

вывод

1
(2, 3, 4, 5)
1
{'a': 2, 'b': 3}
72
задан Jeremey 19 January 2010 в 18:55
поделиться

14 ответов

Попробуйте getTimezone и setTimezone , см. пример

(Но это использует класс)

UPDATE:

Без каких-либо классов вы можете попробовать что-то вроде этого:

$the_date = strtotime("2010-01-19 00:00:00");
echo(date_default_timezone_get() . "<br />");
echo(date("Y-d-mTG:i:sz",$the_date) . "<br />");
echo(date_default_timezone_set("UTC") . "<br />");
echo(date("Y-d-mTG:i:sz", $the_date) . "<br />");

ПРИМЕЧАНИЕ. Возможно, вам потребуется также установить часовой пояс на оригинал

31
ответ дан Phill Pafford 27 August 2018 в 14:24
поделиться
  • 1
    Вы должны просто использовать gmdate вместо изменения часовой пояс по умолчанию для UTC. Потому что gmdate автоматически использует UTC. – poke 19 January 2010 в 20:03
  • 2
    -1, потому что вы не хотите изменять глобальный часовой пояс по умолчанию для этого. Он просто просит непредвиденные побочные эффекты. – Ward Bekker 25 August 2010 в 11:05
  • 3
    Лучший ответ: stackoverflow.com/a/2095801/1443080 – Matteo Tassinari 29 August 2014 в 09:14
  • 4
    @Phill Что здесь 'sz'? – Shahid Karimi 16 July 2015 в 06:07
  • 5
    Я думаю, что это должно быть «Y-m-dTG ...». вместо «Y-d-mTG ...» – Alex Angelico 18 April 2017 в 00:25

Как улучшение на Ответ Филла Паффорда (я не понял его «Y-d-mTG: i: sz», и он предложил вернуть часовой пояс). Поэтому я предлагаю это (я усложнил, изменив формат HMTL в plain / text ...):

<?php
header('content-type: text/plain;');
$my_timestamp = strtotime("2010-01-19 00:00:00");

// stores timezone
$my_timezone = date_default_timezone_get();
echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date)\n";

// changes timezone
date_default_timezone_set("UTC");
echo date("Y-m-d\TH:i:s\Z", $my_timestamp)."\t\t (ISO8601 UTC date)\n";
echo date("Y-m-d H:i:s", $my_timestamp)."\t\t (your UTC date)\n";

// reverts change
date_default_timezone_set($my_timezone);
echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date is back)\n"; 
?>
1
ответ дан 7Tonin 27 August 2018 в 14:24
поделиться

Я когда-нибудь использую этот метод:

// It is not importnat what timezone your system is set to.
// Get the UTC offset in seconds:
$offset = date("Z");

// Then subtract if from your original timestamp:
$utc_time = date("Y-m-d H:i:s", strtotime($original_time." -".$offset." Seconds"));

Выполняет все САМЫ времени.

5
ответ дан aorcsik 27 August 2018 в 14:24
поделиться
  • 1
    Здесь есть две проблемы. Сначала вы не должны вычитать, вы должны добавить смещение. Во-вторых, это не работает, если местный часовой пояс в настоящее время находится в DST, а желаемая дата не включена в DST. Смещение будет отключено на час. Или наоборот. Так что да, это работает МОСТ времени, но не всегда. – ajon 21 August 2013 в 16:17

, вы можете попробовать это:

<?php echo (new DateTime("now", new DateTimeZone('Asia/Singapore')))->format("Y-m-d H:i:s e"); ?>

это выведет:

2017-10-25 17:13:20 Азия / Сингапур

вы можете использовать это внутри атрибута value в текстовом поле ввода, если вы хотите отображать дату только для чтения.

удалить «e», если вы не хотите показать свой регион / страну.

1
ответ дан Bruce Tong 27 August 2018 в 14:24
поделиться

Поскольку strtotime требует определенного формата ввода, можно использовать DateTime :: createFromFormat (требуется php 5.3+)

// set timezone to user timezone
date_default_timezone_set($str_user_timezone);

// create date object using any given format
$date = DateTime::createFromFormat($str_user_dateformat, $str_user_datetime);

// convert given datetime to safe format for strtotime
$str_user_datetime = $date->format('Y-m-d H:i:s');

// convert to UTC
$str_UTC_datetime = gmdate($str_server_dateformat, strtotime($str_user_datetime));

// return timezone to server default
date_default_timezone_set($str_server_timezone);
5
ответ дан Christos Pontikis 27 August 2018 в 14:24
поделиться

Преобразование строки локального часового пояса в строку UTC. например Часовой пояс Новой Зеландии

$datetime = "2016-02-01 00:00:01";
$given = new DateTime($datetime, new DateTimeZone("Pacific/Auckland"));
$given->setTimezone(new DateTimeZone("UTC"));
$output = $given->format("Y-m-d H:i:s"); 
echo ($output);
  • NZDT: UTC + 13: 00, если $ datetime = "2016-02-01 00:00:01", $ output = "2016-01-31 11:00:01" ; если $ datetime = "2016-02-29 23:59:59", $ output = "2016-02-29 10:59:59";
  • NZST: UTC + 12: 00, если $ datetime = "2016-05-01 00:00:01", $ output = "2016-04-30 12:00:01"; если $ datetime = "2016-05-31 23:59:59", $ output = "2016-05-31 11:59:59";

https: / /en.wikipedia.org/wiki/Time_in_New_Zealand

3
ответ дан Frank Hou 27 August 2018 в 14:24
поделиться

Использование DateTime:

$given = new DateTime("2014-12-12 14:18:00");
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 14:18:00 Asia/Bangkok

$given->setTimezone(new DateTimeZone("UTC"));
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 07:18:00 UTC
49
ответ дан joerx 27 August 2018 в 14:24
поделиться

Если у вас есть дата в этом формате YYYY-MM-HH dd: mm: ss, вы можете на самом деле обмануть php, добавив UTC в конце вашей строки «datetime» и используя strtotime для его преобразования.

date_default_timezone_set('Europe/Stockholm');
print date('Y-m-d H:i:s',strtotime("2009-01-01 12:00"." UTC"))."\n";
print date('Y-m-d H:i:s',strtotime("2009-06-01 12:00"." UTC"))."\n";

Это напечатает следующее:

2009-01-01 13:00:00
2009-06-01 14:00:00

И, как вы можете видеть, он также заботится о проблеме с летним временем.

Немного странный способ для его решения ....:)

12
ответ дан Johan 27 August 2018 в 14:24
поделиться
  • 1
    Я действительно не понимаю, почему OP не выбрал ваше предложение :D – php_nub_qq 20 January 2014 в 20:45

С PHP 5 или выше вы можете использовать функцию datetime :: format (см. документацию http://us.php.net/manual/en/datetime.format.php )

 echo strftime( '%e %B %Y' , 
    date_create_from_format('Y-d-m G:i:s', '2012-04-05 11:55:21')->format('U')
    );  // 4 May 2012
2
ответ дан MUY Belgium 27 August 2018 в 14:24
поделиться

Используйте strtotime для создания метки времени из данной строки (интерпретируемой как локальное время) и используйте gmdate , чтобы получить ее как отформатированную дату UTC.

Пример

В соответствии с запросом, вот простой пример:

echo gmdate('d.m.Y H:i', strtotime('2012-06-28 23:55'));
93
ответ дан poke 27 August 2018 в 14:24
поделиться
  • 1
    Может быть, небольшой пример? – cherouvim 28 June 2012 в 17:02
  • 2
    @cherouvim Не думайте, что это необходимо, но все равно добавили ... Надеюсь, это поможет. – poke 28 June 2012 в 22:56
  • 3
    gmdate () является одной из тех функций PHP, которые, как мне хотелось бы, наткнулись давно. nl2br, кто-нибудь? – Charlie Schliesser 16 January 2013 в 00:57
  • 4
    GMT и UTC не всегда одинаковы. – Jay Sheth 3 October 2013 в 15:56
  • 5
    @JaySheth Практически UTC и GMT являются синонимами. – poke 3 October 2013 в 22:20

http://php.net/manual/en/function.strtotime.php , или если вам не нужно использовать строку, а не компоненты времени, тогда http: // us .php.net / ручной / EN / function.mktime.php

2
ответ дан psychotik 27 August 2018 в 14:24
поделиться

Функция нормализации общего назначения для форматирования любой временной метки из любого часового пояса в другой. Очень полезно для хранения datetimestamps пользователей из разных часовых поясов в реляционной базе данных. Для сравнения баз данных отметьте метку времени как UTC и используйте ее с gmdate('Y-m-d H:i:s')

/**
 * Convert Datetime from any given olsonzone to other.
 * @return datetime in user specified format
 */

function datetimeconv($datetime, $from, $to)
{
    try {
        if ($from['localeFormat'] != 'Y-m-d H:i:s') {
            $datetime = DateTime::createFromFormat($from['localeFormat'], $datetime)->format('Y-m-d H:i:s');
        }
        $datetime = new DateTime($datetime, new DateTimeZone($from['olsonZone']));
        $datetime->setTimeZone(new DateTimeZone($to['olsonZone']));
        return $datetime->format($to['localeFormat']);
    } catch (\Exception $e) {
        return null;
    }
}

Использование:

$from = ['localeFormat' => "d/m/Y H:i A", 'olsonZone' => 'Asia/Calcutta'];

$to = ['localeFormat' => "Y-m-d H:i:s", 'olsonZone' => 'UTC'];

datetimeconv("14/05/1986 10:45 PM", $from, $to); // returns "1986-05-14 17:15:00"
1
ответ дан Sandeep 27 August 2018 в 14:24
поделиться

try

echo date ('F d Y', strtotime ('2010-01-19 00:00:00'));

] выведет:

19 января 2010

вы должны изменить время форматирования, чтобы увидеть другой выход

1
ответ дан StevieJ 27 August 2018 в 14:24
поделиться

Сделайте так:

gmdate('Y-m-d H:i:s', $timestamp)

или просто

gmdate('Y-m-d H:i:s')

, чтобы получить «СЕЙЧАС» в UTC.

Проверьте ссылку:

http://www.php.net/manual/en/function.gmdate.php

19
ответ дан this.lau_ 27 August 2018 в 14:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: