Php 从具有不同时区的表中获取当前日期记录

Php 从具有不同时区的表中获取当前日期记录,php,laravel,postgresql,Php,Laravel,Postgresql,这个问题与我的预览一有关: 在我标出答案后,发现一个问题: 当用户加载页面时,它需要给他当天的记录 例如从00:00:00到现在 问题是,在我的模型(在上面的链接中)解析到本地时间之后,控制器要求DB提供UTC 00:00:00的记录 当地时间为欧洲/索非亚(+3小时),导致从今天03:00:00开始错过3条记录 知道怎么修吗 控制员: function getdata_chart(Request $request) { $start_date = dat

这个问题与我的预览一有关:

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

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

例如从00:00:00到现在

问题是,在我的模型(在上面的链接中)解析到本地时间之后,控制器要求DB提供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();

      }
}

您必须通过调用carbon方法和array map函数将用户输入日期从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,请在控制器中添加以下行

使用碳\碳


问题是每个函数上的日期分隔符不同,导致
发现意外数据。
。在编辑了他的答案后,萨钦·库马尔完成了工作。谢谢你。 只需使用类似的长途跋涉解决方案来发现问题:

  $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);
  };

你能展示一些代码吗?与上一个问题一样,您只需通过定义一个访问器来更改属性的值。让我检查一下。我已经添加了答案。您可以检查并实现它。该代码仅在用户没有交互时工作。但是$dbTimeZone绑定什么代码,因为DB是UTC格式的。如果用户选择了一个日期,则会显示衰减错误:“发现意外数据”。↵发现意外数据。↵数据丢失“”。从此处搜索您的时区,或者在用户与formI交互时显示“$request->start_date”和“$request->end_date”值的输出,我知道时区是UTC。但是当绑定到$dbTimeZone='UTC'时;我的问题是发布请求时开始日期和结束日期变量的值和类型是什么。它应该是一个类似于start_date=“10-04-2020”和end_date=“10-04-2020”的字符串