Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add time zone support #5186

Closed
benmccann opened this issue Jan 25, 2018 · 10 comments
Closed

Add time zone support #5186

benmccann opened this issue Jan 25, 2018 · 10 comments

Comments

@benmccann
Copy link
Contributor

benmccann commented Jan 25, 2018

We should add time zone option that let's the user specify which timezone they'd like to use.

Things this could affect:

  • We could have one time zone for parsing data and one used for formatting labels and tooltips (e.g. timestamps are provided in UTC, but you'd like to display in Eastern timezone)
  • Also used when we're calculating major ticks / auto-ticks and try to align to the start of a minute, day, hour, etc. But when the start of the day is depends on the time zone.
  • In some cases we may be able to determine the timezone the user would like to use from the labels they've specified (e.g. +0000)
  • Unit tests are currently flaky because they depend on the timezone they're being run in

Unfortunately JavaScript's time zone support is pretty bad natively. E.g. there's no way to create a Date object in a given timezone. Your only options are local system time or UTC time. We probably want to use only UTC dates or timestamps internally and convert to the proper time zone when needed for the cases listed above.

We would either need library support or would need to implement ourselves. In either case I think we should use Intl.DateTimeFormat APIs. We already get lots of complaints about the size of Moment.js (#4303) and moment-timezone is even larger, so I think we should avoid using it.

@kmcgaire
Copy link

Is this being worked on?

@etimberg
Copy link
Member

@kmcgaire not sure if @benmccann is looking at it or not

@benmccann
Copy link
Contributor Author

Yes. I think we should switch from Moment to either Luxon or date-fns in order to fix this. We couldn't switch to Luxon until Chart.js 3.0 since Chart.js currently exposes Moment in it's interface. I have a pending PR to add timezone support to date-fns and have been waiting for it to be reviewed the past couple month, but the library authors are not very responsive.

@damianobarbati
Copy link

Please consider moving to Luxon.

Inspecting a simple ChartJS app reveals:

  • chartjs taking up to 40KB (gzipped)
  • momentjs taking up to 65KB (gzipped)

Huge. And that's mostly because of locale files.

$ yarn why moment
yarn why v1.6.0
=> Found "moment@2.22.1"
info Reasons this module exists
   - "chart.js" depends on it
   - Hoisted from "chart.js#moment"

screen shot 2018-05-07 at 14 32 08

@pvfpvf
Copy link

pvfpvf commented May 23, 2018

Just to add, the global fix moment.tz.setDefault("UTC"); works for me. But if I use chartjs-plugin-zoom and zoom in, the X axis times immediately revert to local ones.

@benmccann
Copy link
Contributor Author

This has been implemented by adding date adapters

@nemosupremo
Copy link

nemosupremo commented Jun 6, 2019

I took a look through the code, and it doesn't look like timezones are support with "vanilla" chartjs. The adapters.date configuration options isn't parsed by adapter.moment.js.

The solution seems to be to implement your own date adapter to provide this functionality however, according to #5960, the date adapter API is private, so a developer would need to track the date adapter source to code to ensure nothing breaks.

Am I missing something? Because otherwise I'm not sure this should be closed yet.

@benmccann
Copy link
Contributor Author

You can use https://github.com/chartjs/chartjs-adapter-luxon which supports time zones

@perehinik
Copy link

Has it been solved? It looks like it still doesnt work...

@perehinik
Copy link

I've found solution for my use case. Maybe someone will be interested.

let diffUTC = (new Date().getTimezoneOffset()) * 60000;
let dt = new Date('2023-01-10').getTime() + diffUTC;

And then I use dt as X values.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

8 participants