Formatting timezone of Google Charts datetime axis labels

google-visualization, javascript, timezone

Solution

use the `hAxis.ticks` configuration option to provide the axis labels

once the data has been formatted with `DateFormat`

build an array with the labels to be displayed

use object notation to provide the value (`v:`) and formatted value (`f:`) for each label

// Set X-Axis Labels
var xTicks = [];
for (var i = 0; i < dataTable.getNumberOfRows(); i++) {
  xTicks.push({
    v: dataTable.getValue(i, 0),
    f: dataTable.getFormattedValue(i, 0)
  });
}

if you don't necessarily need to format the entire `dataTable`, or you want to use labels that don't exist in the `dataTable`, use the `formatValue` method on `DateFormat`

// Set X-Axis Labels
var xTicks = [];
for (var i = 0; i < dataTable.getNumberOfRows(); i++) {
  xTicks.push({
    v: dataTable.getValue(i, 0),
    f: dateFormat.formatValue(dataTable.getValue(i, 0))
  });      
}

/*** OR ***/      

// custom date, not in dataTable
var customDate = new Date(2016, 9, 4, 22, 7, 7);
xTicks.push({
  v: customDate,  
  f: dateFormat.formatValue(customDate)
});

see following working snippet...

google.charts.load('current', {
  callback: function () {
    var dataTable = new google.visualization.DataTable();
    dataTable.addColumn('datetime', 'Time');
    dataTable.addColumn('number', 'Wolves');
    dataTable.addRows([
      [new Date(2020, 1, 1, 12), 1],
      [new Date(2020, 1, 1, 13), 3]
    ]);

    // Create DateFormat with a timezone offset of -4
    var dateFormat = new google.visualization.DateFormat({formatType: 'long', timeZone: -4});

    // Format the first column
    dateFormat.format(dataTable, 0);

    // Set X-Axis Labels
    var xTicks = [];
    for (var i = 0; i < dataTable.getNumberOfRows(); i++) {
      xTicks.push({
        v: dataTable.getValue(i, 0),
        f: dataTable.getFormattedValue(i, 0)
      });
    }

    var table = new google.visualization.Table(document.getElementById('table_div'));
    table.draw(dataTable);

    var lineChart = new google.visualization.LineChart(document.getElementById('chart_div'));
    lineChart.draw(dataTable, {
      hAxis: {
        ticks: xTicks
      }
    });
  },
  packages:['corechart', 'table']
});
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="table_div"></div>
<div id="chart_div"></div>

Problem

I'm using GoogleCharts to draw a line chart with a 'datetime' type along one axis. I'd like to format the axis labels so that they display times in a specified timezone instead of the default browser timezone. From reading the documentation, there is a DateFormat object which can be supplied with a 'timeZone' option, and then called with the appropriate `DataTable` and column to format all cells in that column. I've noticed that doing this results in values that are correctly formatted if the `DataTable` is drawn as a Table. However, this same formatting does not apply to axis labels on charts such as `LineChart` or `Bar`. Here's my code: ``` var dataTable = new google.visualization.DataTable(); dataTable.addColumn('datetime', 'Time'); dataTable.addColumn('number', 'Wolves'); dataTable.addRows([ [new Date(2020, 1, 1, 12), 1], [new Date(2020, 1, 1, 13), 3] ]); // Create DateFormat with a timezone offset of -4 var dateFormat = new google.visualization.DateFormat({formatType: 'long', timeZone: -4}); // Format the first column dateFormat.format(dataTable, 0); dataTable.getFormattedValue(0, 0); // "February 1, 2020 at 8:00:00 AM UTC-4" var table = new google.visualization.Table(document.getElementById('wolf_table')); table.draw(dataTable); var lineChart = new google.visualization.LineChart(document.getElementById('wolf_chart')); lineChart.draw(dataTable); ``` Here's the resulting charts: Note how the table displays correctly formatted times in the relevant cells, whereas the line chart axes display browser time (GMT in this case). Is there a way of changing the timezone formats of the line chart axis labels? Is there something I might be missing?

Original source