How to escape word from date format angularjs - javascript

I'm trying to find a way to escape word from date format in angular and show result as: 2016-12-23 23:59 GMT. When I'm using next code
'date:"yyyy-MM-dd HH:mm":"GMT"'
The angular shows date without any problem, but without word GMT. However I'm trying to pass a word "GMT" and escape it,
'date:"yyyy-MM-dd HH:mm":"GMT" \"GMT\"'
I'm getting an syntax error.
This date format I'm using as cellFilter for my ui-grid and setting from controller. This is plunker with my problem
Where is my mistake?

You can pass the escape string into your format date string, like this:
cellFilter: 'date:"yyyy-MM-dd HH:mm \'GMT\'":"GMT"'
The result: http://plnkr.co/edit/0FbYfjehnNo26Fw8wKva?p=preview

Could you not just append it?
{{'date:"yyyy-MM-dd HH:mm":"GMT"'}} GMT

You can always make you own custom filter, that accepts date and format it to a desired dispaly format with maybe moment.js or etc...

Related

How to Add "Z" at the end of date string with moment in javascript and nodejs

I want to format my date such that the "Z" letter appears at the end of the date.
I've tried many things but nothing seems to be working. i need it to be in the format of "YYYY-MM-DDT00:00:00.000Z" right now it is in this format except for the Z
How can I include the Z at the end using moment, note that i need the date at the start of the day, as in everything after the "T" is 0.
My Code:
console.log(moment(req.body.to, "YYYY-MM-DD").startOf('day'))
'from': {$eq: moment(req.body.from, "YYYY-MM-DD").startOf('day')},
output of the log:
(moment("2022-10-09T00:00:00.000"))
Taking from the docs you could do:
moment(req.body.to, "YYYY-MM-DD").startOfDay().format("YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")
Escaping characters
To escape characters in format strings, you can wrap the characters in square brackets.
Or, since you only want zeroes:
moment(req.body.to, "YYYY-MM-DD").format("YYYY-MM-DD[T00:00:00.000Z]")
Or, since your example indicates that your date is already in YYYY-MM-DD format, why not just do:
`${req.body.to}T00:00:00.000Z`

Can you get the date format pattern from a date string with Moment.js

I want to be able to get the date format string from a date string in JavaScript.
I also am using Moment.js as well if this can be achieved using this.
As an example if I have a string such as
2019-01-01 15:00:00
I'd like something like this returned
YYYY-MM-DD HH:mm:ss
I've searched the documentation but cannot find any answers to this.
You can use Parse Date Format plug-in:
This plugin extracts the format of a date/time string.
Here a live example:
const input = "2019-01-01 15:00:00"
const dateFormat = moment.parseFormat(input);
console.log(dateFormat);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
<script src="https://gr2m.github.io/moment-parseformat/moment-parseformat.js"></script>
Edit after #VLAZ comment, parseFormat has the preferredOrder option:
parseFormat tries to figure out the the order of day/month/year by itself if it finds 3 numbers separated by ., - or /. But if it can't, it will fallback to preferredOrder, which can either be set as an object to differentiate by separator, or as a simple string.

Require string input for moment to be of certain format

It doesn't seem like moment's date parsing functionality is working as I would expect it. The documentation says the following:
If you know the format of an input string, you can use that to parse a moment.
moment("12-25-1995", "MM-DD-YYYY");
I have the following code:
moment(value, "MM/DD/YYYY");
As I'm testing, I'm entering strings that do not adhere to the MM/DD/YYYY and yet they are parsed successfully as valid moment date.
For example, 1-1-asdf resolves to 01/01/2018.
How can I specify one or more date formats that should be used for string parsing and if it does not match a specified format, the parsed moment will be invalid?
For a quick validation, you could use a regex check:
if (!/^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/.test(value)) {
// Invalid date string
}
Moment has a "strict" mode for parsing dates:
moment("1-1-asdf", "MM/DD/YYYY").toString() => valid, parsed as 01/01/2018
moment("1-1-asdf", "MM/DD/YYYY", true).toString() => invalid, parsed as "Invalid date"
Refer to https://momentjs.com/docs/#/parsing/string-format/ for more info.

datetime Regular Expressions pattern to match yyyy-MM-dd hh:mm:ss format

Im trying to create regex pattern in javascript to validate datetime format yyyy-MM-dd hh:mm:ss
/([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9]) ([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(([\-\+]([0-1][0-9])\:00))/
here is an example on jsfiddle
but its not working when i test it against this date time 2017-08-31 01:22:34
can anybody help me to know whats wrong in my pattern
Thank you
It's because the pattern currently requires, rather than makes optional, the timezone modifier, which isn't present in the example date you gave.
Change the last part to:
( ([\-\+]([0-1][0-9])\:00))?
Also:
your hours sub-group is matching 0-59 rather than 0-23.
you're escaping a number of things you don't need to, e.g. : and -
the pattern allows for invalid dates e.g. 39 as a day.
Revision:
/^([0-2][0-9]{3})\-(0[1-9]|1[0-2])\-([0-2][0-9]|3[0-1]) ([0-1][0-9]|2[0-3]):([0-5][0-9])\:([0-5][0-9])( ([\-\+]([0-1][0-9])\:00))?$/
Note this will not account for invlaid dates in certain months e.g. 30th February. That means either making the pattern more complicated or using something better suited than REGEX for date validation.
It's because of the last part which should be optional (([\-\+]([0-1][0-9])\:00))?
Here is a demo
var a = /([0-2][0-9]{3})-([0-1][0-9])-([0-3][0-9]) ([0-5][0-9]):([0-5][0-9]):([0-5][0-9])(([\-\+]([0-1][0-9])\:00))?/;
console.log('2017-08-31 01:22:34'.match(a))
BTW, you don't have to escape :. - should be escaped only when used inside brackets []
In java, we can use like below and also you can take this pattern for javascript
private static Pattern DATE_PATTERN = Pattern.compile(".*?\[0-9\]{4}-(0\[1-9\]|1\[0-2\])-(0\[1-9\]|\[1-2\]\[0-9\]|3\[0-1\]) (2\[0-3\]|\[01\]\[0-9\]):\[0-5\]\[0-9\]:\[0-5\]\[0-9\]");
public void test() {
if(!DATE_PATTERN.matcher(line.trim()).matches()) {
//code here
}
}
If you want to check only date then remove *? from the pattern

RegEx to split formatting string in JavaScript

I am using a JS date library which has a simple asString() formatting syntax e.g. dd mmm yyyy produces 01 Jan 1970.
Unfortunately should the month happen to contain a letter that appears in the formatting string it can go wrong, e.g. `Date('2014-09-01').asString('dd mmm yyyy') = 01 Septe9ber 2014'
To solve this is quite simple; alter the asString() method to use the format '[dd] [mmm] [yyyy]' instead. However this comes from a global format string used by other methods. The only method that needs the square brackets is the asString method.
So my ideal solution is to simply add a function in that method which replaces any of the following strings within the format string:
formats=['yyyy','yy','mmmm','mmm','mm','m','dddd','ddd','dd','d','hh','min','ss'];
With itself surrounded by []
dd/mm/yyyy => [dd]/[mm]/[yyyy]
Unfortunately the RegEx is proving to be complex - simply looping through each item results in [[d][d]]/[[m][m]]/[[yy][yy]].
So I'd like help writing this RegEx. If it can't be done please say so - I'm not interested in using new libraries as a solution but would consider solutions which solved the problem in a different way within the current asString method (i.e. no breaking changes)
This should do:
var regex = /(min|y+|m+|d+|h+|s+)/g,
newString = format.replace(regex,'[$1]');
Tested with the format "dd/mm/yyyy", resulted in "[dd]/[mm]/[yyyy]"

Categories