diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index 34ed30cef..5f69475ed 100644 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -925,6 +925,12 @@ "jsonata": "expression", "env": "env variable", "cred": "credential" + }, + "date": { + "format": { + "timestamp": "milliseconds since epoch", + "object": "JavaScript Date Object" + } } }, "editableList": { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js index d6f34ee71..f301d0768 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js @@ -408,7 +408,25 @@ } }, re: {value:"re",label:"regular expression",icon:"red/images/typedInput/re.svg"}, - date: {value:"date",label:"timestamp",icon:"fa fa-clock-o",hasValue:false}, + date: { + value:"date", + label:"timestamp", + icon:"fa fa-clock-o", + options:[ + { + label: 'milliseconds since epoch', + value: '' + }, + { + label: 'YYYY-MM-DDTHH:mm:ss.sssZ', + value: 'iso' + }, + { + label: 'JavaScript Date Object', + value: 'object' + } + ] + }, jsonata: { value: "jsonata", label: "expression", @@ -652,6 +670,10 @@ allOptions.flow.options = contextStoreOptions; allOptions.global.options = contextStoreOptions; } + // Translate timestamp options + allOptions.date.options.forEach(opt => { + opt.label = RED._("typedInput.date.format." + (opt.value || 'timestamp'), {defaultValue: opt.label}) + }) } nlsd = true; var that = this; diff --git a/packages/node_modules/@node-red/nodes/core/function/15-change.js b/packages/node_modules/@node-red/nodes/core/function/15-change.js index 0bbd81955..64ce00b88 100644 --- a/packages/node_modules/@node-red/nodes/core/function/15-change.js +++ b/packages/node_modules/@node-red/nodes/core/function/15-change.js @@ -117,7 +117,7 @@ module.exports = function(RED) { }); return } else if (rule.tot === 'date') { - value = Date.now(); + value = RED.util.evaluateNodeProperty(rule.to, rule.tot, node) } else if (rule.tot === 'jsonata') { RED.util.evaluateJSONataExpression(rule.to,msg, (err, value) => { if (err) { diff --git a/packages/node_modules/@node-red/util/lib/util.js b/packages/node_modules/@node-red/util/lib/util.js index ea5ffbbe3..711084d2a 100644 --- a/packages/node_modules/@node-red/util/lib/util.js +++ b/packages/node_modules/@node-red/util/lib/util.js @@ -636,7 +636,15 @@ function evaluateNodeProperty(value, type, node, msg, callback) { } else if (type === 're') { result = new RegExp(value); } else if (type === 'date') { - result = Date.now(); + if (!value) { + result = Date.now(); + } else if (value === 'object') { + result = new Date() + } else if (value === 'iso') { + result = (new Date()).toISOString() + } else { + result = moment().format(value) + } } else if (type === 'bin') { var data = JSON.parse(value); if (Array.isArray(data) || (typeof(data) === "string")) { diff --git a/test/unit/@node-red/util/lib/util_spec.js b/test/unit/@node-red/util/lib/util_spec.js index 3bab2739a..95f838feb 100644 --- a/test/unit/@node-red/util/lib/util_spec.js +++ b/test/unit/@node-red/util/lib/util_spec.js @@ -379,10 +379,17 @@ describe("@node-red/util/util", function() { result = util.evaluateNodeProperty('','bool'); result.should.be.false(); }); - it('returns date',function() { + it('returns date - default format',function() { var result = util.evaluateNodeProperty('','date'); (Date.now() - result).should.be.approximately(0,50); }); + + it('returns date - iso format',function() { + var result = util.evaluateNodeProperty('iso','date'); + // 2023-12-04T16:51:04.429Z + /^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d\.\d+Z$/.test(result).should.be.true() + }); + it('returns bin', function () { var result = util.evaluateNodeProperty('[1, 2]','bin'); result[0].should.eql(1);