есть ли способ изменить формат даты в php?

#php #datetime #chart.js

#php #datetime #chart.js

Вопрос:

у меня есть диаграммы chartjs, которые отображают формат даты

 'm-d-Y H:i:s'
  

вот как даты выводятся из таблицы sql как, но мне нужно, чтобы они отображались как d-m-y на графиках.

моя модель :

 class chartData extends Entity
{
    public static function findBy(
        DateTime $StartDate,
        DateTime $EndDate
    ): array
    {
        $params = [
            $StartDate->format('m-d-Y H:i:s'),
            $EndDate->format('m-d-Y H:i:s'),
        ];
        return self::hydrate(DB::select('EXEC Table @StartDate = ?, @EndDate = ?',
            $params
        ));
    }

}
  

мой контроллер :

 public function index (Request $request)
{
    if (!$request->input('StartDate') amp;amp; !$request->input('EndDate')) {
        $StartTime = Carbon::now()->subDays(7);
        $EndTime = Carbon::now();
    } else {
        $StartTime = Carbon::parse($request->input('StartDate'));
        $EndTime = Carbon::parse($request->input('EndDate'));
    }



    $Activity = chartData::findBy(
        Carbon::parse($StartTime),
        Carbon::parse($EndTime)
    );
  

я не могу просто выполнить a -> format (‘d-m-y’), поскольку я получаю ошибки. у кого-нибудь есть идеи о том, как переформатировать это, чтобы дата отображалась как день / месяц / год?

Обновить:

следуя совету, я изменил свой chartjs, чтобы включить рекомендуемое форматирование даты:

   var ctx = document.getElementById("Chart").getContext('2d');
 var recentActivityChart = new Chart(ctx, {
     type: 'bar',
     data: {
         labels: [],
         datasets: [{
             label: 'hours',
             data: [],
             barThickness: 12,
             fill: true,
             backgroundColor: "rgba(54, 162, 235, 1)",
             borderColor: "rgba(54, 162, 235, 1)",
             borderWidth: 1,
         }]
     },
     options: {
         animation: {
             duration: 1000,
             easing: "linear",
         },
         responsive: true,
         maintainAspectRatio: true,
         legend: {
             display: false,
             position: 'bottom',
             usePointStyle: true,
             labels: {
                 fontColor: "grey",
                 usePointStyle: true,
             },
         },
         scales: {
             yAxes: [{
                 gridLines: {
                     display: true,
                     borderDash: [8, 4],
                 },
                 scaleLabel: {
                     display: true,
                     labelString: 'hours',
                 },
                 ticks: {
                     beginAtZero: false,
                 }
             }],
             xAxes: [{
                 type: 'time',
                 time: {
                     parser: 'labels', // define date format that matches the php data
                     unit: 'day',
                     displayFormats: {
                         day: 'DD-MM-YYYY'
                     },
                     tooltipFormat: 'DD-MM-YYYY'
                 },
                 gridLines: {
                     scaleShowVerticalLines: false,
                     display: false,
                 },
                 ticks: {
                     beginAtZero: false,


                 }
             }]
         },
     }
 });
  

это работает, поскольку даты теперь отображаются в формате дд-мм-гггг. однако теперь диаграмма начинается с 1970 года, а не с того момента, когда фактически начинаются данные в таблице sql.
диаграмма chartjs, показывающая неправильные даты,

есть идеи, как это решить?

Комментарии:

1. В чем ошибка?

Ответ №1:

Эта проблема лучше всего решается во внешнем интерфейсе, а не во внутреннем интерфейсе.

Вы должны определить свою ось X как декартову ось времени следующим образом.

 options: {
  ...
  scales: {
    xAxes: [{
      type: 'time',
      time: {
        parser: '', // define date format that matches the php data
        unit: 'day',
        displayFormats: {
          day: 'D-M-YYYY'
        },
        tooltipFormat: 'D-M-YYYY'
      }
      ...
    }]
  }
  ...
}
  

См . Moment.js чтобы узнать о строках формата , которые могут использоваться для time.parser , time.displayFormats и time.tooltipFormat .

Обратите внимание, что Chart.js внутреннее использование Moment.js для функциональности временной оси. Поэтому вам следует использовать комплектную версию Chart.js это включает в себя Moment.js в одном файле.

Комментарии:

1. я добавил это в свою диаграмму type: 'time', time: { parser: 'labels', // define date format that matches the php data unit: 'day', displayFormats: { day: 'DD-MM-YYYY' }, tooltipFormat: 'DD-MM-YYYY' }, диаграмма форматируется правильным образом, но по какой-то причине она начинается с 1970 года. данные меток извлекаются из строки базы данных, которая имеет даты с 2020 года, поэтому я не уверен, почему она показывает 1970-2020

2. @codingWithNikki: parser свойство должно содержать шаблон, который соответствует дате, полученной из серверной части php.

Ответ №2:

ОБНОВЛЕНИЕ: мне удалось отобразить его правильно! это обновленная диаграмма: мне не нужен был парсер, он понимал без того, что нужно было пропустить.

   var ctx = document.getElementById("recentChart").getContext('2d');
 var recentChart = new Chart(ctx, {
     type: 'bar',
     data: {
         labels: [],
         datasets: [{
             label: 'hours',
             data: [],
             barThickness: 12,
             fill: true,
             backgroundColor: "rgba(54, 162, 235, 1)",
             borderColor: "rgba(54, 162, 235, 1)",
             borderWidth: 1,
         }]
     },
     options: {
         animation: {
             duration: 1000,
             easing: "linear",
         },
         responsive: true,
         maintainAspectRatio: true,
         legend: {
             display: false,
             position: 'bottom',
             usePointStyle: true,
             labels: {
                 fontColor: "grey",
                 usePointStyle: true,
             },
         },
         scales: {
             yAxes: [{
                 gridLines: {
                     display: true,
                     borderDash: [8, 4],
                 },
                 scaleLabel: {
                     display: true,
                     labelString: 'hours',
                 },
                 ticks: {
                     beginAtZero: false,
                 }
             }],
             xAxes: [{
                 type: 'time',
                 time: {
                     unit: 'day',
                     displayFormats: {
                                 day: 'DD-MM-YYYY'
                             },
                 },
                 gridLines: {
                     scaleShowVerticalLines: false,
                     display: false,
                 },
                 ticks: {
                     beginAtZero: true,

                 }
             }]
         },
     }
 });
  

даты теперь отображаются правильно, а не с 1970 года.