how to display local date/time in browser? - node.js

I am coding an nodejs express application. The dates are stored in database using the UTC date/time. I'd like to display the date/time in the user's local time zone. how could I implement this?
Thank you in advance.
Richard Xu

In your template you could do
<span data-date-utc="Wed, 25 Apr 2018 18:16:13 UTC"></span>
Then use js to render it in the users local time (I'm using jQuery here to extract the date string, then render it back to the page)
$('span').text(new Date($('span').attr('data-date-utc')).toLocaleString());
You can use any of the Date Object methods in place of toLocaleString to render your output however you want

Use the moment npm package and for more information refer to the momentjs documentation.
var utcDate = moment.utc("2018-04-26 10:00:00");
var localDate = moment(utcDate).local();
Now you can use the below function to format the date accordingly.
localDate.format("YYYY-MM-DD HH:mm:ss");

Related

Date format in our Application

Can anyone tell me which is the right format to store date in my database.
Suppose if the client and the server are in the same region, we can use unix epoch timestamp or date string. But if the server is in US and the client is from Asia, I knew people saying UTC to auto convert date from the particular region. But I cannot store UTC in MongoDB via Node js, maybe i made it in the wrong way.
.currently I store "09-02-2021" for date and 1612837056077 timestamp. I also get the time from the front end.Also, I am not sure with the above things. Can someone explain the right way of using date and time in a real world application. If possible show me a quick demo in node js and mongoose
Thank you all :)
UTC is the way to go. I don't know what you mean by "But I cannot store UTC in MongoDB via Node js". Create your schema like so:
const client_schema = new mongoose.Schema({
...
...
date_created: {type: Date, default: Date.now},
...
...
});
And date_created will always be stored in UTC format. From UTC, you can convert it to any timezone. Here is just one example, using moment, of how to convert UTC to a Eastern Timezone:
const d = moment(utc_date).utcOffset(moment(utc_date).tz("America/New_York").format('Z'), true).toDate();
Note: moment is being phased out and is no longer recommended for new projects.

Mongoose datetime and timezone, how to get datetime based on server timezone

The first answer of this question suggests that mongoose would adapt the date according to server timezone when retrieving data.
However, I don't have this comportement.
I set the (node) server timezone with :
process.env.TZ='Europe/Paris'
For exemple if I create a simple model like :
const mongoose = require("mongoose");
const testSchema = new mongoose.Schema({
myDate: { type: Date, required: true },
}, { timestamps: true });
exports.Comment = mongoose.default.model('TestSchema', testSchema);
But if I create a date with 2020-01-01 20:20:20, when doing TestSchema.find() the date will be: 2020-01-01T19:20:20.000Z so there are two things that I don't understand :
Europe/Paris is actually UTC +2, so I would expect the date to be either 2020-01-01T18:20:20.000Z in UTC or 2020-01-01T20:20:20.000Z with the server timezone
How to have mongoose automatically set the date to the correct timezone?
I know that myDate is a Date object, so I can convert it manually but I'd rather not have to do it myself for simple reasons like forgetting to convert one of the dates in the application or not having to do it every time a Date field is added
An easy solution that I can think of would be to register a global plugin for mongoose which would use schema.set('toJSON', ... and schema.set('toObject', ...) with the transform method so I can loop through schema fields and if the field is a Date, update it to my timezone.
But I see two problems with this approch :
It doesn't sound very good performance-wise if I am querying a lot of documents each with a lot of fields
As you can see here I am currently not able to register global plugins...
What would be the best method to get the date in the server timezone format? I would rather still store them in UTC but set the hour according to the server timezone.
EDIT :
I just saw that while console.log(myDate) outputs 2018-01-01T19:20:20.000Z console.log(myDate.toString() outputs Mon Jan 01 2018 20:20:20 GMT+0100 (Central European Standard Time) so it seems likes this could be used, even tho I'd rather still have a Date object and converting it to string just before sending it to the client (would need some formatting tho since this format is not very user friendly). But then again, how would I do this globally and not for every date
A few things:
Europe/Paris at 2020-01-01T20:20:20 is UTC+1. It doesn't switch to UTC+2 until Summer Time kicks in on March 29th. Reference here. Thus the conversion to 2020-01-01T19:20:20Z is correct.
The output of console.log when passed a Date object is implementation specific. Some implementations will emit the output of .toString() (which is in local time in RFC 2822 format), and some will emit the output of .toISOString() (which is in UTC in ISO 8601 extended format). That is why you see the difference.
In general, it is not good to send a local time without also sending a time zone offset. ISO 8601 format is ideal, but you should send either 2020-01-01T19:20:20Z, or 2020-01-01T20:20:20+01:00. Don't just send the date and time without an offset to the client. Otherwise, if your client could be in a different time zone then they would interpret the value incorrectly.
Keep in mind that Date objects are not time zone aware. They contain only a Unix timestamp internally, and they convert only to the system's local time zone for the functions that work in local time. They cannot work in any other time zone.
Relying on the system local time zone is bad for portability. One doesn't always have the ability to change it, and it doesn't do well when you have to work in multiple time zones. It would be better to not rely on setting a local time zone from Node's TZ variable. Instead, consider writing your code to be independent of any local time zone setting.
A time zone aware date library can help with most of your concerns. I can recommend Luxon, js-Joda, Moment + Moment-Timezone, or date-fns + date-fns-timezone.
"how would I do this globally" is something I'm not following in your question. Try the approach I described, and if you still have issues then open a new question. Try to be specific and ask a single question. You're likely to get better results that way. Please read How do I ask a good question? and How to create a Minimal, Complete, and Verifiable example. Thanks.
To solve the issue:
npm i mongoose-timezone
In your schema file:
import timeZone from "mongoose-timezone";
const testSchema = new mongoose.Schema({
myDate: { type: Date, required: true },
}, { timestamps: true });
// mongoose will save the dates based on user's timezone
testSchema.plugin(timeZone)
mongoose-timezone basically adds the current timezone offset to the
date before store and removes the offset when retrieving data. This
way dates are kept proportional in the database and in the app.

Converting a date to a string - SuiteScript 2.0

Goal: Convert JS Date Object to a String representation in the format of "11/2/2017" in a NetSuite SuiteScript 2.0 scheduled script.
I have a date object that I need to use for 2 purposes. In one, I am going to use it for comparisons (so I want the actual date object). The other is I want it to be the name of a Custom Record, ie a string value.
I am doing this in NetSuite SuiteScript 2.0 (Javascript) in a Scheduled Script. The toString() of the date right now is: "2017-11-02T07:00:00.000Z". The format I want to end up with for the name is 11/2/2017.
When I test toLocaleDateString() in a browser test app, I get 11/2/2017 - the exact format I want. However, when I sue this same thing in SuiteScript 2.0 I get "November 2, 2017". I know there is a difference between client/server but this was frustrating.
I tried the format.parse() function as NetSuite's documentation claims that this is the equivalent to the 1.0 nlapiDateToString() function. This did not work.
Besides writing my own function (which I am tempted to do), does anyone know how to accomplish this goal?
To switch over to that format you would not use format.parse, you would use format.format. Here is a simple example of converting a date object to that string format.
require(['N/format'],function(format){
function formatDate(testDate){
log.debug('testDate: '+testDate);
var responseDate=format.format({value:testDate,type:format.Type.DATE});
log.debug('responseDate: '+responseDate);
}
var testDate=new Date();
formatDate(testDate);
});
I'm going to suggest using the momentJS library for all of your SuiteScript date manipulation needs. It works well as a SuiteScript 2.0 module and you can format dates easily:
var now = new Date();
var formattedDate = moment(now).format('M/D/YYYY');
Use format.parse module of suitescript 2.0
var myDateString= "04/26/2020";
var parseDate = format.parse({
value: myDateString,
type: format.Type.DATE
});

datetime UTC conversion in mongodb

I do new Date() then save it into mongodb, the date became UTC format?
The datetime I inserted into mongodb when pull back is not the same, what should I do to solve this? Like I create a document on 1/12/2016, and I select range from 1/12/2016, the record is not there. Strange.
As the documentation says :
The mongo shell wraps the Date object with the ISODate helper. The ISODate is in UTC.
So my best guess is that your new Date() is not in UTC.
Math.floor((new Date()).getTime() / 1000)
as seen here: How do I get a UTC Timestamp in JavaScript?
However, Mongo is smart enough to sort this all out for you, so new Date() should be enough.
To query a Date in mongo, you can also use pure Date Objects, without the need to convert them to ISOString.
Keep everything as Date Objects, and it'll work as you intend it to!
The default timezone for node.js new Date() object is UTC (aka GMT).
You should leave it this way and just convert it on your front end. Javascript in the browser can convert the UTC timestamp to the browsers local timezone automatically.
new Date(Date.UTC(saved-timezone))
How do you create a JavaScript Date object with a set timezone without using a string representation

How to pass notedate for User Notes in Netsuite using RESTlet?

I could create and update User Notes in Netsuite for the customer.
The following data is working fine.
$columns_field= array("title","direction","notedate"); #_scheduled
$columns_values=array("Sample User Notes","2","4/30/2016");
$datastring = array('recordtype' => 'note', 'id' => '104','columnname' =>$columns_field,'columnvalues'=>$columns_values,'gu_action'=>'update');
But when i add time for notedate , it will not work. I want to pass date and time. i have tried these formats.
Like
4/30/2016 05:06 am
4/30/2016 05:06 AM
4/30/2016 14:32
I am having RESTlet file in the following link:
https://gist.githubusercontent.com/ganeshprabhus/68a9e5b81e53436bb1d684f857a6c31f/raw/67fe03895f1c31d65c1f283dd51584af45d27c59/NS_Script_2016.2004.
My reference link is :
https://system.netsuite.com/help/helpcenter/en_US/srbrowser/Browser2015_2/schema/record/note.html
Additional Requirement :
If possible, Please post the reference links.
For the Note record date and time are separate fields. Their script ids are "notedate" and "time" respectively.
So if you have a real Date:
note.setFieldValue("notedate", nlapiDateToString(datetime)); //'date' format i s the default
note.setFieldValue("time" , nlapiDateToString(datetime, 'timeofday'));
Try "2015-03-25T12:00:00" for your date string. That's a format that the Javascript Date object will understand, which is what you're ultimately working with in NetSuite (actually it's Rhino + Java, but close enough)
BTW, the T above stands for UTC time, so make sure to keep that in mind.

Resources