草庐IT

php - 将时间分配为 2 小时间隔,并带有偏移量

coder 2024-04-19 原文

这是json格式的列表时间:

$datatest = '{
  "dt": [
    "2018-06-10T00:16:02.200Z",
    "2018-06-11T03:35:10.629Z",
    "2018-06-11T04:20:58.629Z",
    "2018-06-11T05:00:05.171Z",
    "2018-06-11T05:49:05.171Z",
    "2018-06-11T06:53:55.629Z",
    "2018-06-11T06:57:13.708Z"
  ]
}';

我想要的只是按 2 小时间隔分配或分配时间。这是我的 PHP 代码:

$data = json_decode($datatest, false);

echo "<table border=\"1\">";
foreach($data->{'dt'} as $time){
  echo "<tr>";
  echo "<td>".$time;
  $time_in_sec = strtotime($time);
  echo "==>".$time_in_sec."</td>";
  $timeslot = setTimeSlot($time_in_sec);
  echo "<td>Rounded down: " . date('Y-m-d\TH:i:s\Z', $timeslot)."</td>";
  echo "</tr>";
}
echo "</table>";

function setTimeSlot($timeinseconds){

    $seconds = $timeinseconds;
    $rounded_seconds = floor($seconds / (2 * 60 * 60)) * (2 * 60 * 60);
    return $rounded_seconds;
}

下面是结果。我不想要这个输出:

2018-06-10T00:16:02.200Z==>1528589762 Rounded down: 2018-06-10T00:00:00Z
2018-06-11T03:35:10.629Z==>1528688110 Rounded down: 2018-06-11T02:00:00Z
2018-06-11T04:20:58.629Z==>1528690858 Rounded down: 2018-06-11T04:00:00Z
2018-06-11T05:00:05.171Z==>1528693205 Rounded down: 2018-06-11T04:00:00Z
2018-06-11T05:49:05.171Z==>1528696145 Rounded down: 2018-06-11T04:00:00Z
2018-06-11T06:53:55.629Z==>1528700035 Rounded down: 2018-06-11T06:00:00Z
2018-06-11T06:57:13.708Z==>1528700233 Rounded down: 2018-06-11T06:00:00Z

我想修改上面的代码以添加偏移量 1 小时。我需要将它舍入到 2 小时间隔,这样输出就会像这样而不是从 0 小时开始。我不知道如何计算偏移量。

回合时间应该是:07, 09, 11, 13, 15, 17, 19, 21, 23, 01, ... 不应该:08, 10, 12, 14, 16, 18, ...

我终于解决了这个问题。抱歉,添麻烦了。这是代码。 :

function setTimeSlot($timeinseconds){
    $offset = 3600;//1 hours offset
    $seconds = $timeinseconds;
    $rounded_seconds = floor(($seconds - $offset) / (2 * 60 * 60)) * (2 * 60 * 60);
    return ($rounded_seconds + $offset);
}

最佳答案

我认为这对您有用。这将向下舍入到 24 小时格式中最接近的奇数小时。

请注意,我关闭了 html 元素,我只是在命令行上的单个 php 脚本中运行它。此外,我还添加了几个日期字符串用于测试。

<?php

$datatest = '{
  "dt": [
    "2018-06-10T00:16:02.200Z",
    "2018-06-11T03:35:10.629Z",
    "2018-06-11T04:20:58.629Z",
    "2018-06-11T05:00:05.171Z",
    "2018-06-11T05:49:05.171Z",
    "2018-06-11T06:53:55.629Z",
    "2018-06-11T06:57:13.708Z",
    "2018-06-11T11:57:13.708Z",
    "2018-06-11T15:57:13.708Z",
    "2018-06-11T18:57:13.708Z",
    "2018-06-11T23:57:13.708Z"
  ]
}';

$data = json_decode($datatest, false);

foreach($data->{'dt'} as $time){
  echo $time;
  $time_in_sec = strtotime($time);
  // uncomment the following to see the rounding
  //$hour = date('H', $time_in_sec);
  //$roundedHour = roundHour($hour);
  //echo "  " . $hour . "  " . $roundedHour;
  echo "  " . formatDate(getRoundedTime($time_in_sec)). "  ";
  echo "\n";
}

function formatDate($time) {
  return date('Y-m-d\TH:i:s\Z', $time);
}

function getRoundedTime($time) {
    $day = date('d', $time);
    $month = date('m', $time);
    $year = date('Y', $time);
    $hour = roundHour(date('H', $time));
    return mktime($hour, 0, 0, $month, $day, $year);
}

//will round down to nearest odd hour, 01-23 hours
function roundHour(string $hour) {
  $newHour = intval($hour);
  $mod = $newHour % 2;
  if ($mod === 0) {
    $newHour = $newHour - 1;
    $newHour = $newHour === -1 ? 23 : $newHour;
  }
  $roundedHour = (string) $newHour;
  return str_pad($roundedHour, 2, "0", STR_PAD_LEFT);
}

这应该会产生这样的结果:

2018-06-10T00:16:02.200Z  2018-06-10T23:00:00Z  
2018-06-11T03:35:10.629Z  2018-06-11T03:00:00Z  
2018-06-11T04:20:58.629Z  2018-06-11T03:00:00Z  
2018-06-11T05:00:05.171Z  2018-06-11T05:00:00Z  
2018-06-11T05:49:05.171Z  2018-06-11T05:00:00Z  
2018-06-11T06:53:55.629Z  2018-06-11T05:00:00Z  
2018-06-11T06:57:13.708Z  2018-06-11T05:00:00Z  
2018-06-11T11:57:13.708Z  2018-06-11T11:00:00Z  
2018-06-11T15:57:13.708Z  2018-06-11T15:00:00Z  
2018-06-11T18:57:13.708Z  2018-06-11T17:00:00Z  
2018-06-11T23:57:13.708Z  2018-06-11T23:00:00Z

关于php - 将时间分配为 2 小时间隔,并带有偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50949348/

有关php - 将时间分配为 2 小时间隔,并带有偏移量的更多相关文章

  1. Ruby Koans about_array_assignment - 非平行与平行分配歧视 - 2

    通过ruby​​koans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John

  2. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  3. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

  4. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  5. ruby - 在 Ruby 中重新分配常量时抛出异常? - 2

    我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案

  6. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  7. ruby-on-rails - 带有 Zeus 的 RSpec 3.1,我应该在 spec_helper 中要求 'rspec/rails' 吗? - 2

    使用rspec-rails3.0+,测试设置分为spec_helper和rails_helper我注意到生成的spec_helper不需要'rspec/rails'。这会导致zeus崩溃:spec_helper.rb:5:in`':undefinedmethod`configure'forRSpec:Module(NoMethodError)对thisissue最常见的回应是需要'rspec/rails'。但这是否会破坏仅使用spec_helper拆分rails规范和PORO规范的全部目的?或者这无关紧要,因为Zeus无论如何都会预加载Rails?我应该在我的spec_helper中做

  8. ruby - 使对象的行为类似于 ruby​​ 中并行分配的数组 - 2

    假设您在Ruby中执行此操作:ar=[1,2]x,y=ar然后,x==1和y==2。是否有一种方法可以在我自己的类中定义,从而产生相同的效果?例如rb=AllYourCode.newx,y=rb到目前为止,对于这样的赋值,我所能做的就是使x==rb和y=nil。Python有这样一个特性:>>>classFoo:...def__iter__(self):...returniter([1,2])...>>>x,y=Foo()>>>x1>>>y2 最佳答案 是的。定义#to_ary。这将使您的对象被视为要分配的数组。irb>o=Obje

  9. Ruby:如何使用带有散列的 'send' 方法调用方法? - 2

    假设我有一个类A,里面有一些方法。假设stringmethodName是这些方法之一,我已经知道我想给它什么参数。它们在散列中{'param1'=>value1,'param2'=>value2}所以我有:params={'param1'=>value1,'param2'=>value2}a=A.new()a.send(methodName,value1,value2)#callmethodnamewithbothparams我希望能够通过传递我的哈希以某种方式调用该方法。这可能吗? 最佳答案 确保methodName是一个符号,而

  10. ruby - 在没有基准或时间的情况下用 Ruby 测量用户时间或系统时间 - 2

    因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实

随机推荐