Comparing 2 Times with DateJS - javascript

I've seen a few different questions on here regarding finding the difference between using two different dates.
My question is similar to Parse ONLY a time string with DateJS.
I basically have 2 time inputs:
<input id="start_time" type="text">
<input id="end_time" type="text">
The format of these will always be: 07:15 AM or 08:30 AM
Essentially, what I am trying to do is ensure the start_time is not greater than the end_time.
I have tried using DateJS to parse the date, but it returns null:
Date.parseExact("03:15 PM", "HH:mm"); <--- returns null
How should I go about comparing the two input fields (using DateJS or something else) to ensure the start_time is not greater than the end_time?
Any help would be great.

You need to add the AM/PM field to the format you're using to parse with. Try using
HH:mm tt
Instead of
HH:mm

Not exactly answering the question, but DateJS looks a bit outdated. I would suggest you take a look at Moment.js, where you can do this:
moment("03:15 PM", "hh:mm A").isAfter(moment("03:05 PM", "hh:mm A"));
// false

Why not using toString?
var g = new Date("2012-01-11 03:15 PM");
console.log(g.toString('HH:mm'));
just add a ficticious date in order to obtain a valid date string format.
Since I guess you just need the Time not the date
It works fine with me.

You can use Date.parseExact with the format revision presented by #matthewtole, or you should be able to just use 'Date.parse' as well.
Date.parseExact will provide better performance, but if you're just parsing two values, the performance improvement of Date.parseExact is probably not going to make much difference.
You can also use the .isBefore() function to check if one Date occurs before the other.
Example
var d1 = Date.parse("07:15 AM");
var d2 = Date.parse("08:30 AM");
d1.isBefore(d2); // true
Hope this helps

Related

How to get hours in moment.js in GMT timezone?

For example if I do for the above date object something like: value.hours(), I get as output 16 instead of 18. I believe it returns the hours in the original GMT time, not like in my date object which is GMT+2. I can of course add 2 to the returned result, but it becomes cumbersome. Is there any way to get the hours correctly in my case?
I'm not sure as to what you've already tried, but I put the following into JSFiddle and it worked like a charm. I am currently in CST in America and it is 8:30 in the morning here. When I ran the snippet below I got today's date at 1:30 PM which I would assume is accurate in difference.
HTML
<div id="m1"></div>
JavaScript
var a = moment.tz(new Date(), "GMT");
document.getElementById('m1').innerHTML = a.format("YYYY MM DD; HH:mm");
The Moment.js documentation states the following in regards to creating a Moment object with a native JavaScript Date object:
You can create a Moment with a pre-existing native JavaScript Date object.
var day = new Date(2011, 9, 16);
var dayWrapper = moment(day);
This clones the Date object; further changes to the Date won't affect the Moment, and vice-versa.
To find the information quoted above quickly, when you reach the Moment.js documentation, it is located under the Parse section under sub-section Date.
To display local time:
value.local();
value.hours(); // 18
To reverse:
value.utc();
value.hours(); // 16
I think that you can solve it by doing what the docs says. Something like this:
moment().tz("America/Los_Angeles").format();
https://momentjs.com/timezone/docs/#/using-timezones/

Java Script return Invalid Date for Date with time set for "11:59:59 PM"

This is driving me crazy for an hour.
Here is a snap shot of my Chrome console.
You can see how the default js Date() function is behaving so inconsistently with different dateTime string provided to it.
Anyone knows anything? How should I deal with it?
Thanks
Some browser use the "dd/mm/yyyy" format, other "mm/dd/yyyy" and so on, either way, for you to not get invalid date you need to know which format the date class/function/method will use so you can pass the date string in that order.
Obviously the browser you tested on use "mm/dd/yyyy" and therefore your first date is invalid as there exist no a month with number "30" as in "30/09/2015".
Of course it would be clever if browser could guess and in this case it would be easy but this, "10/12/2015", it wouldn't, as both the "mm/dd/yyyy" and "dd/mm/yyyy" will have a corresponding real date, "10 of Dec" and "12 of Oct", and we can't let the browser decide which one is the one we mean, as both will pass as valid.
Check this question for a deep dive into the issue and as well a couple of ways how to solve it
- Why does Date.parse give incorrect results?
Your format is wrong. There is no 30th month.
Try this,
new Date("09/30/2015 11:59:59 PM")

Simplest way to Convert to invalid date to a moment object

I have store hour information that is given like this
Sunday 8:00
Sunday 22:00
Since it is store hour information the year, month, and date do not matter but unfortunately I still need to this information to be a moment object for formatting/ Organisation reasons.
What is the simplest way to convert this invalid date format into a moment object.
I've heard of sugar and it seems perfect but my team will not want to have to install it for just one simple thing, so no libraries unless it is something included in angularjs.
Specify the input format:
moment("Sunday 8:00", "dddd hh:mm");
Reference
If I understand you properly you already have the Date javascript Object. Then you can just set it using:
var day = new Date(2011, 9, 16);
var dayWrapper = moment(day); //or your JS Date object.
You can read it at Moment.js doc: http://momentjs.com/docs/#/parsing/date/

Convert from string with milliseconds to date object Javascript

I got this problem when dealing with date time conversion. I have timestamp data from postgreSQL database with format like this one
"2011-04-04 19:27:39.92034"
In order to display it in highcharts, I have to convert it to date or time object. Without milliseconds, I easily convert it with Date.js
But milliseconds can't be handled with that library. I tried also with Date.parse but always got NaN.
Any solution for this problem? Thank you
JS built in Date class should be able to handle this, and getTime() can return milliseconds since start 1970 (UNIX time). Watch out for time zone issues though; the constructor may interpret the date/time as being local, but getTime()'s milliseconds since 1970 may be in UTC, baking in a conversion that is difficult to remove.
new Date("2011-04-04 19:27:39.92034").getTime()
1301941659920
Many ways to Rome. The given code will return '(datestr=) 2011-4-4 19:27:39.92'. Is that what you look for?
var darr = '2011-04-04 19:27:39.92034'.split('.')
, dat=new Date(darr[0])
, datestr = '';
dat.setMilliseconds(Math.round(darr[1]/1000));
datestr = [ [dat.getFullYear(),dat.getMonth()+1,dat.getDate()].join('-')
,' ',
[dat.getHours(),dat.getMinutes(),dat.getSeconds()].join(':')
,'.',
dat.getMilliseconds()
].join('');
Can't you just cut of the last 6 chars of that string? You might then round the miliseconds and eventually add a second to you time object.
This is simpler and in one line:
new Date('01/09/2015 06:16:14.123'.split(".")[0])

Java date format to JavaScript date format

I would like to be able to convert a Java date format string, e.g. dd/MM/yyyy (07/06/2009) to a JavaScript date format string, e.g. dd/mm/yy (07/06/2009).
Has anyone done this before, or got any idea where I might find some code that already does this?
Edit:
Thanks for all the replies but now I realize my mistake and possibly why so many of you were struggling to understand the question; JavaScript doesn't have a built in date formatting ability. I am using the jQuery UI datepicker and I have been setting its date format, assuming it would be calling a standard JS function at some point, not using its own library! When I googled for formatting strings I jumped straight to the tables of what letters could be used, skipping the bit at the beginning explaining how to use the script.
Anyway I'll have to go ahead and possibly write my own I guess, converting a Java date format string into a jQuery date format string (or as close as possible) - I am working on the i18n of our product and have created a java class that stores the preferred date format string used throughout the application, my intention was to also have the ability to supply any jsps with the format string that is equivalent in JS.
Thanks anyway.
If you just need to pass a date from Java to JavaScript, the best way to do it, I think, would be to convert the Java date to milliseconds using date.getTime(), create a JavaScript date initialized with this milliseconds value with new Date(milliseconds)and then format the date with the means of the JavaScript Date object, like: date.toLocaleString().
You could use my plugin jquery-dateFormat.
// Text
$.format.date("2009-12-18 10:54:50.546", "dd/MM/yyyy");
// HTML Object
$.format.date($("#spanDate").text(), "dd/MM/yyyy");
// Scriptlet
$.format.date("<%=java.util.Date().toString()%>", "dd/MM/yyyy");
// JSON
var obj = ajaxRequest();
$.format.date(obj.date, "dd/MM/yyyy");
A similar topic has been answered here:
Converting dates in JavaScript
I personally have found this to be a rather large pain and took the author's suggestion and used a library. As noted, jQuery datepicker has one that is a viable solution if you can afford the overhead of download for your application or already using it.
Check out moment.js! It's "A lightweight javascript date library for parsing, manipulating, and formatting dates". It is a really powerful little library.
Here's an example...
var today = moment(new Date());
today.format("MMMM D, YYYY h:m A"); // outputs "April 11, 2012 2:32 PM"
// in one line...
moment().format("MMMM D, YYYY h:m A"); // outputs "April 11, 2012 2:32 PM"
Here's another example...
var a = moment([2012, 2, 12, 15, 25, 50, 125]);
a.format("dddd, MMMM Do YYYY, h:mm:ss a"); // "Monday, March 12th 2012, 3:25:50 pm"
a.format("ddd, hA"); // "Mon, 3PM"
a.format("D/M/YYYY"); // "12/3/2012"
Also, its worth mentioning to checkout date.js. I think the two libraries complement each other.
This JavaScript library should be able to help you.
http://plugins.jquery.com/project/fIsForFormat
(I don't know why they have it as a jQuery Plugin, because it works standalone.)
You'd simply split the original formatted date into its individual elements and then create a new Date Object with those elements. Then, use this library's "Date.f()" method to output it into any format you could want.
For example:
var dateOld = "11/27/2010",
dateArr = date1.split("/"),
dateObj = new Date(dateArr[2], dateArr[0], dateArr[1]),
dateNew = dateObj.f("MMM d, yyyy");
document.write("Old Format: " + dateOld + "<br/>New Format: " + dateNew);
This works fine for me:
<%
Date date = Calendar.getInstance().getTime();
%>
<script>
var d = new Date(<%=date.getTime()%>);
alert(d);
</script>
I suggest you the MomentJS with this Plugin that allow you to convert a Java pattern to a JS pattern (MomentJS)
On Java Side
I recommend passing an Instant string which conforms to ISO 8601 standard.
import java.time.Instant;
class Main {
public static void main(String[] args) {
Instant instant = Instant.now();
// You can pass the following string to JavaScript
String strInstant = instant.toString();
System.out.println(strInstant);
// If the number of milliseconds from epoch is required
long millis = instant.toEpochMilli();
System.out.println(millis);
}
}
Output from a sample run:
2022-12-31T09:40:52.280726Z
1672479652280
ONLINE DEMO
Learn more about the modern Date-Time API from Trail: Date Time.
On JavaScript Side
Now, you can parse the ISO 8601 string on the JavaScript side simply by passing it as a parameter to Date constructor. You can also instantiate the Date object with the number of milliseconds from the epoch.
var date = new Date("2022-12-31T09:40:52.280726Z");
console.log(date.toISOString());
// Or if the number of milliseconds from epoch has been received
date = new Date(1672479652280);
console.log(date.toISOString());
The javascript code in this page implements some date functions and they "use the same format strings as the java.text.SimpleDateFormat class, with a few minor exceptions". It is not the very same as you want but it can be a good start point.
If you just want to format dates my date extensions will do that well - it also parses data formats and does a lot of date math/compares as well:
DP_DateExtensions Library
Not sure if it'll help, but I've found it invaluable in several projects.
If you are using java, take a look at the Simple Date Format class.

Categories

Resources