What is the best way to initialize a JavaScript Date to midnight?
The setHours
method can take optional minutes
, seconds
and ms
arguments, for example:
var d = new Date();
d.setHours(0,0,0,0);
That will set the time to 00:00:00.000
of your current timezone, if you want to work in UTC time, you can use the setUTCHours
method. Setting Javascript date object to midnight without being based on user computer date
Something like this I would guess: new Date(Date.UTC(year, month, day, hour, minute, second))
w3schools Reference
Set date() to midnight in users timezone with moment.js
I'm not sure that I fully understand your question, but I'll give you some general advice and tips.
When using moment.js, there is very little need to ever use the
Date
object. Only use it for interacting with other APIs that expect aDate
object.To get a moment in UTC, just use
moment.utc(...)
, passing the appropriate arguments, such asmoment.utc([2016,3,30])
ormoment.utc('2016-04-30')
for midnight April 30th UTC.If you want to convert that back to the user's local time, use the
.local()
function. For example,moment.utc('2016-04-30').local()
will create a moment with the equivalent local time to the UTC time provided.If you want a moment in the user's local time, then that would be
moment(...)
, such asmoment([2016,3,30])
ormoment('2016-04-30')
for midnight April 30th local time.You can difference two moments using the
diff
function, which can give the answer in specific units, such asm1.diff(m2, 'seconds')
wherem1
andm2
are moment objects.You don't need to call
format
twice. Just encapsulate any text you want outputed with square brackets..format('dddd, DD.MM.YYYY [a las] HH:mm A')
You might look into moment's locale support. If I'm not mistaken, "a las" indicates Spanish, however it's not always "a las", but sometimes "a la", if the hour is
1
. Also, moment only uses those words in its.calendar()
function, such as when producing a phrase like"mañana a las 13:17"
. A regular date formatted with.format('LLLL')
in the Spanish locale would be something like:"sábado, 19 de marzo de 2016 13:17"
. So, you might want to verify that "a las" is exactly what you want in every case.The title to this question was how to set a date to midnight. For that, I recommend using moment's
startOf
function.m.startOf('day')
will give set the momentm
to the start of the day, which is usually midnight. Keep in mind that not every local day actually starts at midnight in every time zone. Due to anomalies like daylight saving time, some days might start at 1:00. For example, this occurs in Brazil on October 16th this year.Also, if you created the moment in UTC mode, you may wish to convert it back to local mode first before setting it to the start of the day. If you don't want to change the original moment object, be sure to clone it first.
Putting this all together:
var m1 = moment.utc([2016,3,30]);
var m2 = m1.clone().local().startOf('day');
var now = moment();
var diff = m1.diff(now, 'seconds');
Create a Date with a set timezone without using a string representation
using .setUTCHours()
it would be possible to actually set dates in UTC-time, which would allow you to use UTC-times throughout the system.
You cannot set it using UTC in the constructor though, unless you specify a date-string.
Using new Date(Date.UTC(year, month, day, hour, minute, second))
you can create a Date-object from a specific UTC time.
Is the Javascript date object always one day off?
Notice that Eastern Daylight Time is -4 hours
and that the hours on the date you're getting back are 20
.
20h + 4h = 24h
which is midnight of 2011-09-24. The date was parsed in UTC (GMT) because you provided a date-only string without any time zone indicator. If you had given a date/time string w/o an indicator instead (new Date("2011-09-24T00:00:00")
), it would have been parsed in your local timezone. (Historically there have been inconsistencies there, not least because the spec changed more than once, but modern browsers should be okay; or you can always include a timezone indicator.)You're getting the right date, you just never specified the correct time zone.
If you need to access the date values, you can use getUTCDate()
or any of the other getUTC*()
functions:
var d,
days;
d = new Date('2011-09-24');
days = ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat'];
console.log(days[d.getUTCDay()]);
Related Topics
Using the Haversine Formula in JavaScript
Detect If an Element Is Visible with Jquery
Window.Location.Reload with Clear Cache
React-Router Getting This.Props.Location in Child Components
Why Is Window (And Unsafewindow) Not the Same from a Userscript as from a <Script> Tag
Why Does JavaScript's Regex.Exec() Not Always Return the Same Value
Why Does ('0' ? 'A':'B') Behave Different Than ('0' == True ? 'A':'B')
Scroll Smoothly to Specific Element on Page
How to Check If an Array Is a Subset of Another Array in JavaScript
How to Access Nested JSON Data
Why Are Es6 Classes Not Hoisted
Why How to Not Throw Inside a Promise.Catch Handler
Angular 2.1.0 Create Child Component on the Fly, Dynamically
Localstorage Object Is Undefined in Ie
How to Set Node_Env to Production/Development in Os X