【问题标题】:Get current date records from table with different time zone从具有不同时区的表中获取当前日期记录
【发布时间】:2020-04-13 16:03:59
【问题描述】:

这个问题和我的预览有关:How to change time zome in different tables in Laravel

我标记答案后,发现一个问题:

当用户加载页面时,它需要给他当天的记录。

例如从 00:00:00 到现在。

问题是控制器要求数据库从 UTC 时间 00:00:00 开始提供记录,之后我的模型(在上面的链接中)将其解析为本地时间。

这个当地时间是欧洲/索非亚(+3 小时),导致从今天 03:00:00 开始错过 3 条记录。

知道怎么解决吗?

控制器:

      function getdata_chart(Request $request)
      {
        $start_date = date('d-m-Y 00:00:00');
        $end_date = date('d-m-Y 23:59:59');
        if($request->start_date != '' && $request->end_date != '')
        {
          // if user fill dates
          $dateScope = array($request->start_date ." 00:00:00", $request->end_date ." 23:59:59");
        } else {
          // default load page - today
          $dateScope = array($start_date, $end_date);
        };
        $students = MeasCanal::whereBetween('recordtime', $dateScope)
      ->selectRaw('recordtime')
      ->selectRaw('max(formattedvalue) filter (where fullname = \'Данни.Кота\') as iazovir')
      ->selectRaw('max(formattedvalue) filter (where fullname = \'Данни.Температура\') as temperatura350')
      ->where(function ($query) {
        $query->where('fullname', 'like', "Язовир.Данни.Кота")
              ->orWhere('fullname', 'like', "ГСК_11_350.Данни.Температура");
      })
      ->groupBy('recordtime')
      ->orderBy('recordtime')
      ->get();

        return response()->json($students);

      }
    return response()->json($students);
}

型号:

class MeasCanal extends Model
{
  protected $connection = 'MeasCanal';
  protected $table = 'meas_kanal';
  protected $fillable = ['fullname','formattedvalue','recordtime','qualitydesc','statedesc','id'];


  /**
       * Get the user's recordtime.
       *
       * @param  string  $value
       * @return string
       */
      public function getRecordtimeAttribute($value)
      {
              return Carbon::parse($value)->timezone('Europe/Sofia')->toDateTimeString();

      }
}

【问题讨论】:

  • 你能显示一些代码吗?与上一个问题一样,您只需通过定义访问器来更改属性的值。
  • OK,代码已添加。
  • 好的。让我检查一下。
  • 我已经添加了答案。您可以检查并实施它。

标签: php laravel postgresql


【解决方案1】:

您必须通过调用 carbon 方法和数组映射函数将用户输入日期从 DB 时区映射到用户时区。并按原样调用查询。

function getdata_chart(Request $request) {
    $start_date = date('d-m-Y 00:00:00');
    $end_date = date('d-m-Y 23:59:59');

    if($request->start_date != '' && $request->end_date != '')
    {
        // if user fill dates
        $dateScope = array($request->start_date ." 00:00:00", $request->end_date ." 23:59:59");
    } else {
        // default load page - today
        $dateScope = array($start_date, $end_date);
    };


    $dbTimeZone = 'Asia/Kolkata'; // update with your db timezone
    $userTimeZone = 'Europe/Sofia';

    $dateScope = array_map(function($date) use ($dbTimeZone, $userTimeZone) {
        return Carbon::createFromFormat('d-m-Y H:i:s', $date, $dbTimeZone)->setTimezone($userTimeZone);
    }, $dateScope);

    $students = MeasCanal::whereBetween('recordtime', $dateScope)
                ->selectRaw('recordtime')
                ->selectRaw('max(formattedvalue) filter (where fullname = \'Данни.Кота\') as iazovir')
                ->selectRaw('max(formattedvalue) filter (where fullname = \'Данни.Температура\') as temperatura350')
                ->where(function ($query) {
                $query->where('fullname', 'like', "Язовир.Данни.Кота")
                      ->orWhere('fullname', 'like', "ГСК_11_350.Данни.Температура");
                })
                ->groupBy('recordtime')
                ->orderBy('recordtime')
                ->get();

    return response()->json($students);

    }
    return response()->json($students);
}

请注意:-如果您还没有使用 carbon til,则将以下行添加到控制器中。

使用碳\碳;

【讨论】:

  • 该代码仅在用户没有交互时工作。但是要为 $dbTimeZone 绑定什么代码,因为数据库是 UTC 格式的。如果用户选择一个日期,则会显示休闲错误:“”发现意外数据。 ↵发现意外数据。 ↵数据丢失""
  • php.net/manual/en/timezones.php。从这里搜索您的时区
  • 或者当用户与你的表单交互时显示“$request->start_date”和“$request->end_date”值的输出
  • 我知道时区是 UTC。但是当它绑定到 $dbTimeZone = 'UTC';它给了我 06:00:00 am
  • 我的问题是发布请求时 start_date 和 end_date 变量的值和类型是什么。它应该是一个字符串,例如 start_date = "10-04-2020" 和 end_date = "10-04-2020"
【解决方案2】:

问题是每个函数上的日期分隔符不同导致Unexpected data found.。在编辑他之后,Sachin Kumar 的回答完成了这项工作。感谢那。 只需通过类似的长期解决方案发现问题:

  $start_date0 = date('d-m-Y 00:00:00');
  $end_date0 = date('d-m-Y 23:59:59');

  $start_date = Carbon::createFromFormat('d-m-Y H:i:s', $start_date0, 'Europe/Sofia')->setTimezone('UTC');
  $end_date = Carbon::createFromFormat('d-m-Y H:i:s', $end_date0, 'Europe/Sofia')->setTimezone('UTC');


  if($request->start_date != '' && $request->end_date != '')
  {
    // if user fill dates
    $start_date0 = $request->start_date;
    $end_date0 = $request->end_date;
    $start_date = Carbon::createFromFormat('d/m/Y H:i:s', $start_date0, 'Europe/Sofia')->setTimezone('UTC');
    $end_date = Carbon::createFromFormat('d/m/Y H:i:s', $end_date0, 'Europe/Sofia')->setTimezone('UTC');
    $dateScope = array($start_date, $end_date);
  } else {
    // default load page - today
    $dateScope = array($start_date, $end_date);
  };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    相关资源
    最近更新 更多