【问题标题】:Time or Time interval conversion with PHP使用 PHP 进行时间或时间间隔转换
【发布时间】:2013-10-06 06:05:49
【问题描述】:

我在下拉列表中有以下给定的时间间隔选项(这些是字符串)

<select name="CSSAtapsClient[client_time_window][0]" id="client_time_window_0">
<option value="5702">7am - 10am</option>
<option value="5703">10am - 1pm</option>
<option value="5704">12pm - 3pm</option>
<option value="5705">3pm - 6pm</option>
<option value="5706">6pm - 9pm</option>
<option value="5707">7pm - 10pm</option>
<option value="5708">9pm - 12am</option>
<option value="5709">12am - 7am</option>
</select>

我需要将这些时间间隔转换为特定的 GMT 时区。例如,假设它在 GMT +8 时,我需要将其转换为 GMT +10,它可以通过增加 2 小时来完成。

所以如果给定的时间间隔是 7am - 10am (GMT +8) 它应该是 9am - 12pm (GMT +10)

转换这种时间间隔的最佳方法是什么?我在这里看到的问题是它的字符串(时间间隔)。

感谢您早日回复。

编辑 1

我只转换到澳大利亚各州,因此转换时不可能有一天的差异。请检查此链接http://www.timebie.com/tz/australiatimezone.php

【问题讨论】:

  • 这些时间代表什么?你怎么得到它们?请注意,根据时区差异,您也可能会在天数上有所不同
  • @JasonOOO 是的,我忘了说我只为澳大利亚国家进行转换。所以它大多像 1 或 2 小时的变化。请检查此链接timebie.com/tz/australiatimezone.php

标签: php time yii timezone timestamp


【解决方案1】:

试试这个功能。 (根据您的编辑,我将 gmt_to_gmt 函数的 $to_gmt var 默认值为“GMT +10”)

    <?php

        function is_am_pm($str){
            if(strpos($str, "am") !== false || strpos($str, "AM") !== false) return "am";
            if(strpos($str, "pm") !== false || strpos($str, "PM") !== false) return "pm";
        }
        function get_only_int($str){
            if(strpos($str, ".") !== false){
                if(preg_match_all("/\s(.*?)\.(.*?)$/", $str, $matches))
                    return trim(trim($matches[0][0]),"+");

            }else{
                return (int) preg_replace('/\D/', '', $str);
            }
        }
        function gmt_to_gmt($str,$from_gmt,$to_gmt = "GMT +10"){
            if(!is_numeric($from_gmt)) $from_gmt = get_only_int($from_gmt);
            if(!is_numeric($to_gmt)) $to_gmt = get_only_int($to_gmt);

            $temp_time = explode("-",$str);

            $begin_time_s   = is_am_pm($temp_time[0]);
            $begin_time     = get_only_int(trim($temp_time[0]));
            $end_time_s     = is_am_pm($temp_time[1]);
            $end_time       = get_only_int(trim($temp_time[1]));


            $time_diff  = $to_gmt - $from_gmt;

            $begin_time = $begin_time + $time_diff;
            $end_time   = $end_time + $time_diff;

            if($begin_time > 11){
                if($begin_time_s == "am"){
                    $begin_time >= 12 && $begin_time < 13 ? $begin_time : $begin_time -= 12;
                    $begin_time .= "pm";  
                }else{
                    $begin_time >= 12 && $begin_time < 13 ? $begin_time : $begin_time -= 12;
                    $begin_time .= "am";  
                }
            }else{
                $begin_time .= $begin_time_s;
            }

            if($end_time > 11){

                if($end_time_s == "am"){
                    $end_time >= 12 && $end_time < 13 ? $end_time : $end_time -= 12;
                    $end_time .= "pm";  
                }else{
                    $end_time >= 12 && $end_time < 13 ? $end_time : $end_time -= 12;
                    $end_time .= "am";  
                }
            }else{

                $end_time .= $end_time_s;
            }

            return $begin_time . " - " . $end_time;
        }
        echo gmt_to_gmt("11am - 10pm", "GMT +0" , "GMT +2.5"); 
    ?>

祝你有美好的一天

【讨论】:

  • 这是我的错,对不起。我更正了我的帖子。 if($begin_time > 12 (不是 13))
  • 还有另一件事。当我将输入输入为上午 10 点时。它给了我上午 12 点,实际上应该是下午 12 点。 echo gmt_to_gmt("10am - 11pm", "GMT +0" , "GMT +2"); // 凌晨 12 点 - 凌晨 1 点。感谢您的及时回复。你几乎拯救了我的一天!
  • 好的。代码已更改。第一个是 ' $end_time > 11 ' 第二个是 'end_time == 12 ? $end_time : $end_time -= 12';
  • echo gmt_to_gmt("11am - 11pm", "GMT +0" , "GMT +2.5");提供无效数据。我想我应该调试并找出导致此问题的原因。无论如何 tnx 走了这么远。我想这应该是一个小问题。结果是下午 24 点到凌晨 24 点,“GMT +2.5”。它只取整数而不是双精度数吗?
  • get_only_int 函数被重写。现在,您可以计算 GMT 2.5。我更改了代码。不客气
【解决方案2】:

我完成的答案。

<?php

function is_am_pm($str) {
   if (strpos($str, "am") !== false || strpos($str, "AM") !== false)
      return "am";
   if (strpos($str, "pm") !== false || strpos($str, "PM") !== false)
      return "pm";
}

function get_only_int($str) {
   if (strpos($str, ".") !== false) {
      if (preg_match_all("/\s(.*?)\.(.*?)$/", $str, $matches))
         return trim(trim($matches[0][0]), "+");
   }else {
      return (int) preg_replace('/\D/', '', $str);
   }
}

function gmt_to_gmt($str, $from_gmt, $to_gmt = "GMT +10") {
   if (!is_numeric($from_gmt))
      $from_gmt = get_only_int($from_gmt);
   if (!is_numeric($to_gmt))
      $to_gmt = get_only_int($to_gmt);

   $temp_time = explode("-", $str);

   $begin_time_s = is_am_pm($temp_time[0]);
   $begin_time = get_only_int(trim($temp_time[0]));
   $end_time_s = is_am_pm($temp_time[1]);
   $end_time = get_only_int(trim($temp_time[1]));


   $time_diff = $to_gmt - $from_gmt;
   $begin_time = $begin_time + $time_diff;
   $end_time = $end_time + $time_diff;

   if ($begin_time > 11.59) {
      if ($begin_time_s == "am") {
         $begin_time >= 12 && $begin_time < 13 ? $begin_time : $begin_time -= 12; // 13.3 - 12
         $begin_time .= "pm";
      } else {
         $begin_time >= 12 && $begin_time < 13 ? $begin_time : $begin_time -= 12;
         $begin_time .= "am";
      }
   } else {
      $begin_time .= $begin_time_s;
   }

   if ($end_time > 11.59) { // 11.3
      if ($end_time_s == "am") {
         $end_time >= 12 && $end_time < 13 ? $end_time : $end_time -= 12;
         $end_time .= "pm";
      } else {
         $end_time >= 12 && $end_time < 13 ? $end_time : $end_time -= 12;
         $end_time .= "am";
      }
   } else {
      $end_time .= $end_time_s;
   }

   return format_string($begin_time)." - ".format_string($end_time);
}

function format_string($str) {
   $temp_am_pm = is_am_pm($str);
   $str = (float) preg_replace('/^\D*/', '', $str);
   $val = '';

   if (is_int($str))
      $val = sprintf("%02s", $str);

   else if (is_float($str))
      $val = str_pad(sprintf("%0.2f", $str), 5, '0', STR_PAD_LEFT);

   return $val.$temp_am_pm;
}
echo gmt_to_gmt("12am - 1pm", "GMT +0", "GMT +2.30");

?>

输出 - 02.30pm - 03.30pm

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
相关资源
最近更新 更多