10

I'm using the excellent (but large) DateJS library to handle dates and times in my webapp. I just came across something that I'm not sure how to handle.

I want my users to be able to enter Time strings only, without a date, but they should be able to enter it in any manner they please. For instance:

  • 5:00 pm
  • 17:00
  • 5:00pm
  • 5:00p
  • 5p
  • etc.

Using Date.parse(value) converts these strings into a full date, which is exactly what I want. However, it also allows the user to enter any other part of a date string, such as:

  • sat 5pm
  • 1/1/2010 5pm
  • etc.

I'm trying to use DateJS to validate an input field for a time value. Something like:

function validateTime(value) {
    return Date.parse(value) !== null;
}

Is there a way to use DateJS features to solve this? There are other SO questions that provide solutions, but if DateJS has a way to do this, I don't really want to add more custom code to my app to do this.

2 Answers 2

10

Shortly after asking my question, I discovered that Date.parseExact() can take an array of format strings. Somehow I'm missed that. I managed to get something working with the following code:

function validateTime(input) {
    return Date.parseExact(input, [
            "H:m",
            "h:mt",
            "h:m t",
            "ht","h t"]) != null ||
        Date.parseExact(input, [
            "h:mtt",
            "h:m tt",
            "htt","h tt"]) != null;
};

Note that some formats don't seem to be able to be included together at the same time, which is why I split them into two separate parseExact() calls. In this case, I couldn't include any string that contained a single t in it with format strings that contained a double tt in it.

Sign up to request clarification or add additional context in comments.

1 Comment

Also use the pattern "HHmm" to allow for 24-hour notation (aka military time or astronomical time).
5

The additive approach seems cumbersome. Takes away the beauty of DateJS in my opinion. I needed the same solution and decided to just sneakily append the date in front of my input string before parsing with DateJS:

var parsed = Date.parse(Date.today().toString('M/d/yyyy') + ' ' + this.value);

if (parsed) {
  alert(parsed.toString('h:mm tt'));
}

Now DateJS will not be sniffing around for any of its date-part parsing patterns, as you have already subbed it in.

Hope this helps someone!

1 Comment

Nice idea, much simpler than the solution I proposed! And rather obvious... frustrated that I didn't think of it ;)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.