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?
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?
Share Improve this question edited Feb 27, 2015 at 12:03 Neil asked Feb 27, 2015 at 11:32 NeilNeil 1111 silver badge6 bronze badges 1- I am in the exact same scenario as you. I ended up converting the DataTable to the same time in the local timezone. e.g. I converted Feb 1, 2020 at 8AM UTC-4 to Feb 1, 2020 at 8AM UTC-8, so that the graph rendered correctly, but kept the original data for use everywhere else in my app. – Robert Hui Commented Dec 3, 2015 at 0:55
1 Answer
Reset to default 2use 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./charts/loader.js"></script>
<div id="table_div"></div>
<div id="chart_div"></div>