Получить текущие записи даты из таблицы с другим часовым поясом - PullRequest
0 голосов
/ 10 апреля 2020

Этот вопрос связан с моим предварительным просмотром: Как изменить время в разных таблицах в Laravel

После того, как я отмечу ответ, обнаружу проблему:

Когда пользователь загружает страницу, ему нужно дать ему записи за текущий день.

Например, с 00:00:00 до настоящего момента.

Проблема заключается в том, что контроллер запрашивает у БД выдачу записей с 00:00:00 в UT C, после этого моя модель (по ссылке выше) разбирает его на МЕСТНОЕ время.

Это местное время - Европа / София (+3 часа), в результате чего с сегодняшнего дня пропускаются 3 записи, начиная с 03:00:00.

Есть идеи как это исправить?

Контроллер:

      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();

      }
}

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Необходимо сопоставить дату ввода пользователя из часового пояса БД с часовым поясом пользователя, вызвав метод углерода и функцию отображения массива. и вызовите запрос как есть.

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.

использовать Carbon \ Carbon;

0 голосов
/ 13 апреля 2020

Проблема заключалась в том, что разделитель даты отличался на каждой функции, вызывая Unexpected data found.. После редактирования его ответ Сачин Кумар сделал свою работу. Спасибо за это. Просто откройте для себя проблему с помощью аналогичного решения:

  $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);
  };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...