简体   繁体   中英

DateTime JavaScript vs C#

Regardless of many posts I've read the magic still in my code. I have DateTime value in db ('2011-03-30 00:00:00.000') that I retrieve for asp.net/mvc page where some javascript needs to read it and compare. The magic in the following:

<% 
DateTime unixTimeOffset = new DateTime(1970, 1, 1, 0, 0, 0, 0);
DateTime testDate = new DateTime(2011,03,30,0,0,0,0);
%>
<%= (testDate - unixTimeOffset).TotalMilliseconds %>
...

Last string of the code gives me this value: 1301443200000 When I try to read it in JavaScript I have:

val myDate = new Date(1301443200000);

And myDate is Tue Mar 29 2011 20:00:00 GMT-0400 (Eastern Daylight Time) {} But not a March 30th as it should be.

I understand it provides date referencing to local time, GMT-4 but what is the solution to get it independent? Any ideas? Thanks.

For C# Related Dates:

You may want to consider using DateTime.ToUniversalTime() and .UTCNow() , which will allow you to keep all days independent of time-zones.

 DateTime date = DateTime.UTCNow();

For Javascript-Related Dates:

Javascript features a UTC Method that should get you the Universal Time as well.

//Declaration
var date = new Date(Date.UTC(YYYY,MM,DD));

//Use
var newDate = date.toUTCString();

Hope this helps :)

Get the timezone offset in the client and add that to the value from the server. Like this:

var serverOffset = 1301443200000;
var localOffset = myDate.getTimezoneOffset() * 60 * 1000;
var myDate = new Date(serverOffset + localOffset);
console.log(myDate); // Wed Mar 30 2011 00:00:00

Please note that Tue Mar 29 2011 20:00:00 GMT-0400 (Eastern Daylight Time) is the same point in time as your original date in UTC. This method creates a new date that represents a new point in time . However, if you're just trying to display the same date value, then this method does the trick.

Alternatively, you can use Date 's UTC methods to print your original date in UTC:

function pad(num) {
    return ("0" + num).slice(-2);
}

function formatDate(d) {
    return [d.getUTCFullYear(), 
            pad(d.getUTCMonth() + 1), 
            pad(d.getUTCDate())].join("-") + "T" + 
           [pad(d.getUTCHours()), 
            pad(d.getUTCMinutes()), 
            pad(d.getUTCSeconds())].join(":") + "Z";
}

formatDate(new Date(1301443200000));

Output:

"2011-03-30T00:00:00Z"

Your code is correct. The myDate variable holds the correct date since Tue Mar 29 2011 20:00:00 GMT-0400 is the same point in time as Wed Mar 30 2011 00:00:00 GMT+0000 . My guess is that you see the former since that is your computers time zone. Use myDate.toUTCString() to see the date as UTC.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM