Javascript Date unnecessarily adjusts for timezone [duplicate] - javascript

This question already has answers here:
Parsing a string to a date in JavaScript
(35 answers)
Closed 2 years ago.
I am storing a date as a django DateField in my database. It simply looks like "2020-06-25" in the database.
This string is returned from my api, and passed into a javascript "Date" as such:
date = new Date(due_date)
logging this date results in:
Wed Jun 24 2020 17:00:00 GMT-0700 (Pacific Daylight Time)
I don't care about the time, only the date. How do I get javascript Date to ignore the time, and not adjust for the difference in timezone between the DB and the local user? If a user sets the due date for a project in one timezone, I want every person to see the same due date.

Converting a string to a date in JavaScript
This guided me to the answer. Browsers handle this differently, but you can force the date to display in UTC time, rather than letting the browser decide if it wants to covert to the end user's local time or not.

Related

When formatting date object - does it matter that the T and the 000Z will be removed when storing to db?

Sorry if its a very basic question but I dont understand the following:
When I format the Date object (no matter what library I used), I get a string.
from this: 2022-11-28T16:55:44.000Z (new Date object)
I get this: 2022-11-28 16:55:44 (or other formats obviously depending how I format it)
Even if I turn it back into an object it, the T and 000Z will never be there anymore. Do I just ignore that (seems like it as any library or date methods are ignoring the T and the string ending when formatting) or do I add it 'back' Isnt it a problem if dates stored in my db are different (for later queries etc.)?
The Z indicates UTC (Coordinated Universal Time, also known as Greenwich Meridian Time), dropping that changes the meaning - unless your browser or server lives in the Greenwich time zone and it is winter (no daylight saving time).
You can convert back and forth between a Date object and a UTC string as follows (my browser lives in the Central European time zone):
> utc = '2022-11-28T16:55:44.000Z'
'2022-11-28T16:55:44.000Z'
> d = new Date(utc)
Mon Nov 28 2022 17:55:44 GMT+0100 (Central European Standard Time)
> d.toISOString()
'2022-11-28T16:55:44.000Z'
Alternatively, you can convert back and forth between a Date object and a formatted string in your browser's or server's time zone (the last line shows that my browser's format differs from yours):
> formatted = '2022-11-28 17:55:44'
'2022-11-28 17:55:44'
> d = new Date(formatted)
Mon Nov 28 2022 17:55:44 GMT+0100 (Central European Standard Time)
> d.toLocaleString()
'11/28/2022, 5:55:44 PM'
But you should not store the Date objects in this format in a database, unless you can guarantee that they are always read and written in the same time zone. For example, if you format a Date object with your browser (in CET) and store it, then someone else who reads it and converts it back to a Date object with their browser in the New Zealand time zone will see a wrong value. Also, dates like 9/11/2022 are ambiguous if the formatting rules are not clear (September 11th or November 9th?).
That's why I would prefer UTC strings when storing Date objects and use formatted strings only for outputting them to the user and for parsing user input.
I see it even stronger: You should never store dates as strings, it's a design flaw. Store always proper Date objects. Here on SO you can find hundreds of questions, where people have problems, because they stored date values as (localized) strings. It is not limited to MongoDB, it applies to any database.
Date objects in MongoDB are UTC times - always and only! Usually the client application is responsible to display the date/time in local time zone and local format.
What do you mean by "turn it back", i.e. how do you do it?
You should not rely on new Date(<string>) without time zone. Some browsers/environments may apply UTC time, others may use current local time zone, see Differences in assumed time zone
Have a look at 3rd party date libraries, e.g. moment.js, Luxon, or Day.js. Usually they provide better control how to parse strings and time zones.

How can I determine which time zone (e.g. Central Daylight Time) I'm in with JavaScript? [duplicate]

This question already has answers here:
Determine a user's timezone
(27 answers)
Get name of time zone
(14 answers)
Closed 3 years ago.
On my workstation using several browsers, JavaScript's new Date().toString() method returns a string such as:
Thu Aug 15 2019 17:34:40 GMT-0500 (Central Daylight Time)
I'm interested in how it knows about "Central Daylight Time"?
I know how to get the offset (e.g. -300) using getTimeZoneOffset(), but I don't see any documented approach to get the named time zone.
Is parsing the output of toString() really the best approach?
If you check the docs here, Javascript should return the offset of the local time zone from UTC measured in milliseconds at local time, When the result is subtracted from the local time it should yield the corresponding UTC. Although there is no mention of how the low-level operation is made to get the current pc time.

Convert Javascript date to shorter date time and also UTC [duplicate]

This question already has answers here:
Why does Date.parse give incorrect results?
(11 answers)
Where can I find documentation on formatting a date in JavaScript?
(39 answers)
Closed 5 years ago.
I have a JavaScript Date which I want to get it into SQL Server datetime field.
The JavaScript time sent over as
Fri Sep 15 2017 00:11:44 GMT-0700 (US Mountain Standard Time)
I want it to be converted in javascript or in C#
I need the date to be like
2017-09-15 23:47:01
OR perhaps
9/15/2017 11:47:01 PM
I need to also convert it to UTC , not sure if that is easier to do in javascript or in C#
Which type of format is my code even in? "Fri Sep 15 .." ??
For UTC I was seeing code like this
var isoDate = new Date('yourdatehere').toISOString();
( I am doing .net core web api, with Angular 4 / Typescript)
As Keith said, working with dates is really hard in javascript, especially considering very different implementations across the browsers. So I will second their opinion: just use moment.js and leave everything to that library. It is really powerful. Using it you can get any date format you can possibly think of. To get "2017-09-15 23:47:01" all you need is the following (please pay attention that qualifiers are case sensitive!):
var fmt = moment(<your_js_date_if_you_have_it>).format("YYYY-MM-DD HH:mm:ss");
You can find all supported qualifiers here.
Apart from formatting this library also allows you to do a lot of manipulations with the dates, compare them, translate dates from local to UTC time zone and back, etc.

How to determine if a day comes in PST or PDT in javascript [duplicate]

This question already has answers here:
How to check if DST (Daylight Saving Time) is in effect, and if so, the offset?
(15 answers)
Closed 8 years ago.
I am creating a date in node js, my server is in IST, I want to determine if the date would come PDT or PST (i.e. If the Daylight saving is on or off). If my server was in PST/PDT time it would be automatically decide. Is there any way I can determine this?
After creating the date with ...Date() you are able to retrieve the timezone offset of the client with ...getTimezoneOffset(). You can not tell whether the client is in DST or not, but you have the absolute amount to GMT/UTC. Or, you can further retrieve the time a UTC timestamp and convert that to whatever you want on the server.

Create New JavaScript Date Object With Different Timezone During Initialization [duplicate]

This question already has answers here:
How to initialize a JavaScript Date to a particular time zone
(20 answers)
Closed 9 years ago.
I have seen a lot, really a lot of post to find out a solution for my problem, but i couldn't get it, so decided to create a question.
My Question is how do we actually create a new javascript date object in different timezone, not in local timezone
i know we could create local date object and convert it to different timezone in number of ways, but i dont want to convert instead i need to create in specific timezone.
here is simple example for my problem,
Say, user has choosen a timezone "America/New_york", so all the dates in a calendar page will be shown in that timezone.
Now, if we create a event at "05:00 pm" , how do we actually create date with time 5 pm in "America/New_york" timezone,
if we use new Date() (assume browser is in different timezone say "Asia/Kolkata"), then converting it to "America/New_york" will not get "5:00pm" in that timezone , instead it will get corresponding time of "05:00 pm IST" in that timezone which will have different hour & minute value.
Any suggestion would be helpful!
Thanks
The short answer is you can't.
A Date object is just an accessor to the system time settings (so it will use the local computer timezone anyway). You can then manipulate your dates by substracting the local timezone using getTimezoneOffset(), or forcing a time with setUTCHours().
Note that moment.js is a good alternative to handle dates and timezones: http://momentjs.com/

Categories

Resources