node-red-contrib-moment 中文文档教程
node-red-contrib-moment
Node-RED 节点 moment 使用 Moment.JS 生成格式良好的日期/时间字符串图书馆。 该节点完全了解时区/DST/区域设置。
节点人性化将持续时间(时间跨度)转换为文本描述(例如2分钟)。
两个节点都了解输出字符串的语言。
图。 1:节点外观
基于 Node-RED Google 群组中的对话。 在 Jaques44 的初始工作之后更新了时区/区域设置功能。 Google 网上论坛的另一次转化后进行了 +/- 调整。
Installation
In Node-RED (preferred)
- Via Manage Palette -> Search for "node-red-contrib-moment"
In a shell
基本安装:
- go to the Node-RED "userDir" folder, typically
~/.node-red
- run
npm install node-red-contrib-moment
要获取最新的开发版本,请安装:
- run
npm install TotallyInformation/node-red-contrib-moment
Usage of node moment
节点最简单的用法是向其提供时间戳注入:
图 1 2:基本使用节点时刻
Updates
请参见CHANGELOG文档。
Usage
Moment
节点通常期望来自传入消息的输入。 默认情况下,这是 msg.payload。 如果它是可识别的日期/时间,它将应用一种格式并相应地输出结果字符串或对象。
输入和输出时区可与输出区域设置一样设置。 所有这些都默认为主机系统 tz/locale。
这允许使用节点从一个时区转换到另一个时区。 它还将考虑夏令时 (DST)。
您还可以通过添加或减去金额来对日期/时间进行调整。
Configuration of node moment
图
1 3:节点moment的属性
Input from and Output to
这两个配置属性定义了msg
属性,其中输入和输出数据分别从resp读取。 写给. 默认为 msg.payload
。
Input Timezone and Output Timezone
Input Timezone
此属性定义通过输入 msg
馈送的时间的时区。 输入时间在内部被转换为 UTC 以便进一步处理。
输入时区的格式为地区/位置,例如欧洲/伦敦。 另请参阅时区列表,例如内置于 moment-timezone 或在 维基百科。
注意:拼写未经过验证,如果它似乎不起作用,请使用这些时区列表检查地区/位置的有效性。
以下行为有效:
- If the input data contains a Node-RED timestamp this property is ommitted
- If the host system has a local timezone set (e.g.
dpkg-reconfigure tzdata
on Linux), the input timestamp is related to this local timezone. - If the host system has no local timezone set, the input timestamp is related to UTC.
- If the input data contains an interpretable string, this property is used (to convert internally to UTC).
如果在设置中留空,则可以从传入的 msg.inTz
属性中设置此字段。
Output Timezone
此属性定义通过输出 msg
发出的时间的时区。 输出时区的格式如上所述(请参阅输入时区)。
以下行为有效:
如果输出格式留空,则输出格式为“Zulu”格式,与附加属性输出时区和的内容无关>区域设置。
祖鲁语格式请参阅:https://momentjs.com/docs/#/displaying/as-iso-string/
(示例:2013-02-04T22:44:30.652Z)
如果在设置中留空,则可以从传入的 msg.outTz
属性中设置此字段。
Adjustment
使用此属性,可以通过手动给定值来调整时间。 调整可以是正的或负的,并且可以以毫秒、秒、分钟、小时、天、周、月、季度、年为单位给出。
Output Format and Locale
这两个属性的组合定义了输出 msg
中发出的输出格式。
Output Format
Output Format 属性定义格式,并在 moment.js 显示格式部分中进行了描述一个>。
它可以是 moment.js 定义的任何格式字符串。 还允许添加来自 moment-timezone 的格式。 此外,还允许使用其他格式字符串(不区分大小写,括号中的替代项)。
请注意,除了 ISO8601 之外,其他格式均采用指定的时区和时间。 夏令时。 如果未指定,输出时区/DST 与输入相同。
使用 UTC 的输出时区强制输出到该时区。
Format string defined by moment.js
moment.js 定义的格式字符串基本上有两个选项:
手动给定格式字符串: 这是一个其中时间/日期部分由字符表示的字符串。 文本部分也是允许的。 示例:
“DD.MM.YYYY HH:mm”给出20.09.2020 08:30
“dddd, MMMM Do YYYY, h:mm:ss a”给出Sunday, February 14th 2010, 3:25:50 pm
“[Today is] dddd”给出 Today is Sunday
“[Date: ]YYYY-MM-DD [Time:]HH:mm:ss”给出 < em>日期:2020-09-20 时间:08:31:45
"fromNow"给出一个月内
“日历”给出上周一< /em>
预定义本地化字符串: 这是定义本地化格式的字符串。 示例:
“LLL”给出 October 20, 2020 8:33 AM
“LTS”给出 8:30:25 PM
“llll”给出 Thu, Sep 4, 1986 8:30 PM
有关更多选项,请参阅 https://momentjs.com/docs/#/displaying/format/。
Format string is left blank resp. is "ISO8601" or "ISO"
在这种情况下,输出采用 ISO 8602 格式,例如“2015-01-28T16:24:48.123Z”。
请注意,ISO8601 格式的输出始终采用 UTC(“Z”,祖鲁时间),而不是本地时间,无论您指定哪个输出时区。
另请参阅 moment().toISOString()
。
Format string is "date" resp. "jsDate"
这是一个 Javascript Date 对象,格式为 {years:nnnn, Months:n, date:n, hours:n, 分钟:n, Seconds:n, milliseconds:n}.
它可用于手动(固定)数据/时间值。
警告:moment.js 有一种奇怪的对象格式,其中月份是从零开始的 (0-11),而不是像所有其他元素一样从 1 开始 (1-12)。 我目前不知道为什么,我提出了一个上游问题,但这似乎是出于某种奇怪的原因而故意做出的决定。
另请参阅 moment().toObject()
。
Format string is "fromNow" resp. "timeAgo"
这是人类可读的输出,例如 30 分钟前 或 一个月内(此输出格式类型仅给出粗略的时间跨度,另请参阅人性化< /em> 下面的例子)。 时间跨度是根据实际时间和输入节点的时间得出的。
另请参阅 moment().fromNow()
。
Format string is "calendar" resp. "aroundNow"
这是人类可读的替代方案,例如上周一或明天下午2:30。 请注意,一周后的日期将输出为 yyyy-mm-dd。
另请参阅 moment().calendar()
。
Format string is "date" resp. "jsDate"
此输出格式类型实际上不起作用(请参阅问题#37)。
Locale
如果是文本输出字符串内容,Locale 属性定义文本部分的语言(例如“October”、“Oktober”、“ottobre”、“lokakuuta”)。
如果输出以错误的格式显示,例如美国 mm/dd/yy 格式的日期,请更改输出区域设置。 例如,使用 en_gb 将强制短日期以 dd/mm/yy 格式输出。 默认值是 en,假定表示美国 :-(
另请参阅 区域设置帮助程序 (注意:并非支持给出的每个区域设置).
Topic (additional topic)
使用此属性,您可以向输出 msg.topic
添加附加主题。 生成的 msg
可能是(值“myTopicString”):
{"_msgid":"b16b00b5.bada55","payload":"2020-09-20T12:47:55.143Z","topic":"myTopicString"}
Input of node moment
对象中的输入值输入自可以是以下类型:
时间戳: 当前日期/时间用作输入。
msg、全局或流以及给定的属性为空或不存在:当前日期/时间用作输入。
JSON 日期时间对象: 该数据时间对象可能包含以下元素:年、月、天、小时、分钟、秒、毫秒。
示例:
{“年”:2020,“月”:1,“日期”:11,“小时”:5,“分钟”:6}
。如果未给出元素(例如对象中缺少年和月),则使用实际时间值。
包含可识别日期/时间字符串的属性: 该值将被解释和处理。
示例:
2020-02-11T05:06
包含数值的属性: 该值将被假定为 UNIX 时间值(自 1970 年 1 月 1 日以来的毫秒数)。 备注:这是节点Inject在选项时间戳处发出的格式。
包含不可识别日期/时间字符串的属性(包括
null
):然后不会发生任何转换,输出将是空字符串加上调试警告。
请注意,解析日期/时间字符串是一个难题。 moment.parseFormat 有帮助,但它并不神奇。 我们假设不明确的输入日期(例如 3/5/05)采用 EU/UK 格式 dd/mm/yy,除非输入时区位于美国或区域设置设置为 en_US。
Outputs of node moment
如果 output 属性不是 msg.payload
,则输入 msg.payload
将保留在输出中。
如果配置属性输出格式不是日期,则日期/时间输出为格式化字符串。 jsDate 或 object 在这种情况下,输出是 Javascript 日期对象或分别如下所述的对象。
输出字符串格式由区域设置和输出格式设置控制。 请注意,ISO8601 输出(默认)会忽略输出时区,此类输出始终采用 UTC。 对于其他格式,输出将采用指定的时区,默认为您的主机时区。
指定不同的输入和输出时区允许您在它们之间进行转换。
输出 msg
将传递输入 msg.topic
,除非它被 Topic 配置属性覆盖。 如果输出到字段从默认的msg.payload
更改,则输入msg.payload
也将是通过传递。
Usage of node humanizer
该节点将输入时间跨度转换为人性化文本字符串并输出 msg.payload. humanized
。 输出字符串的语言源自系统的语言环境,即它是不可更改的(如 moment 节点的 Locale 属性)。
另请参阅 moment.duration(). humanize()。
(由 Laro88 贡献)
Configuration of node humanizer
图。 4: 节点 humanizer 的属性
'Input variable'
该属性定义了用于转换的输入msg.payload
属性。 如果留空,则使用 msg.payload
。
Input of node humanizer
输入是定义时间跨度(以秒为单位)的数字。
Outputs of node humanizer
输出是 msg.payload. humanized
中的字符串对象。
时间跨度按时间间隔进行评估,有关详细信息,请参阅 humanizer 示例。
Examples
备注:示例流程位于示例子目录中。 在 Node-RED 中,可以通过导入功能导入它们,然后在垂直选项卡菜单中选择示例。
所有示例流程也可以在此包的示例文件夹中找到。
Usage of the moment node
基本用法如图2所示。以下示例将概述如何使用丰富的配置属性。
Usage of configuration properties Output Timezone, Output Format and Adjustment
示例流程为:
输出时区格式调整流程
图。 5:示例流程显示了输出时区、输出格式和调整的
Usage of configuration property Input Timezone
用法示例流程为:
输入时区流程
图。 6:示例流程显示输入时区的用法
Usage of configuration properties Output Format and Locale
示例流程为:
输出格式区域设置流程
图。 7:示例流程显示输出格式和区域设置的使用
Usage of the humanizer node
示例流程为:
人性化流程
图。 8:示例流程显示了 humanizer 节点的用法
Depends on
- Moment.js - Clever date/time handler for Node.js and browsers
- Moment-Timezone - Adds timezone and locale awareness to Moment.js
- Zulu time format
- Timezones (tzdata)
- Moment-ParseFormat - Tries to interpret input strings as date/times and creates a format string that moment.js can use.
- Locale Helper - lists locale options
- Node-RED - of course!
To Do
我想对 moment 节点执行的操作摘要(不一定立即执行):
[ ] 添加一些用于执行日期操作的附加节点/时间计算 - 部分完成,可以从主节点进行简单的加/减
[ ] 添加附加节点以进行持续时间计算
[ ] 将组合框添加到格式字段,并预先填充常用格式
[x] 改进 Moment 时的错误消息.JS 无法解释输入(说出原因)
[x] 允许更多输入日期/时间格式 - 事实证明 Moment.JS 在这里并没有真正的帮助。 目前,我看到太多美国/英国日期格式等的输入失败。 如果我能够解析“人类”输入,例如“明天”和“从现在起 2 分钟后”,那就太好了。 我们现在可以输出它们,但不能输入它们。 从 v1.0.5 开始,支持本地化参数。
~~部分完成:添加了 parseFormat 插件。 失败了,详情见代码。~~现在完成了。
License
此代码是 Apache 2 许可证下的开源代码。 有关详细信息,请参阅 apache2-license.txt 文件。
除非遵守许可证,否则您不得使用此代码。 您可以在以下位置获取许可证的原始副本:
http://www.apache.org/licenses/LICENSE-2.0
除非适用法律要求或书面同意,否则根据许可证分发的软件将在 “按原样”基础,不带任何明示或暗示的保证或条件。 请参阅 管理许可证下的权限和限制的特定语言的许可证。
Author
朱利安·奈特(全部信息 ),https://github.com/totallyinformation
Contributors/Credits
非常感谢您的贡献。
Feedback and Support
请通过此存储库的 Github 问题列表报告任何问题或建议。
有关更多信息、反馈或社区支持,请参阅 Node-RED Google 群组论坛:https://groups.google.com/forum/#!forum/node-red
node-red-contrib-moment
Node-RED node moment produces a nicely formatted Date/Time string using the Moment.JS library. The node is fully time zone/DST/locale aware.
Node humanizer converts time durations (time spans) into textual descriptions (e.g. 2 minutes).
Both nodes are locale aware regarding the language of the output strings.
Fig. 1: Node appearance
Based on thoughts from a conversation in the Node-RED Google Group. Updated with timezone/locale capabilities after Jaques44's initial work. Updated with +/- adjustments after another conversion in the Google Group.
Installation
In Node-RED (preferred)
- Via Manage Palette -> Search for "node-red-contrib-moment"
In a shell
Basic installation:
- go to the Node-RED "userDir" folder, typically
~/.node-red
- run
npm install node-red-contrib-moment
To get the latest development version, install with:
- run
npm install TotallyInformation/node-red-contrib-moment
Usage of node moment
The easiest usage of the node is feeding it with an timestamp inject:
Fig. 2: Basic usage node moment
Updates
Please see the CHANGELOG document.
Usage
Moment
The node generally expects an input from the incoming msg. By default, this is msg.payload. If it is a recognisable date/time, it will apply a format and output the resulting string or object accordingly.
Input and output time zones are settable as is the output locale. All of which default to the host systems tz/locale.
This allows the node to be used to translate from one time zone to another. It also will take into account daylight savings time (DST).
You can also apply an adjustment to the date/time by adding or subtracting an amount.
Configuration of node moment
Fig. 3: Properties of node moment
Input from and Output to
These two configuration properties define the msg
properties in which the input and output data are read from resp. written to. Default is msg.payload
.
Input Timezone and Output Timezone
Input Timezone
This property defines the timezone of the time fed via the input msg
. Internally the input time is converted into UTC for further processing.
The format of Input Timezone is in the format region/location, e.g. Europe/London. See also timezone lists e.g. built in to moment-timezone or given in wikipedia.
Note: Spellings are not validated, if it doesn't seem to work, check the validity of region/location with these timezone lists.
The following behaviour is valid:
- If the input data contains a Node-RED timestamp this property is ommitted
- If the host system has a local timezone set (e.g.
dpkg-reconfigure tzdata
on Linux), the input timestamp is related to this local timezone. - If the host system has no local timezone set, the input timestamp is related to UTC.
- If the input data contains an interpretable string, this property is used (to convert internally to UTC).
If left blank in settings, this field may be set from the incoming msg.inTz
property.
Output Timezone
This property defines the timezone of the time emitted via the output msg
. The format of Output Timezone is described above (see Input Timezone).
The following behaviour is valid:
If Output Format is left blank, the output format is in 'Zulu' format, independent of the contents of the additional properties Output Timezone and Locale.
Zulu format see: https://momentjs.com/docs/#/displaying/as-iso-string/
(Example: 2013-02-04T22:44:30.652Z)
If left blank in settings, this field may be set from the incoming msg.outTz
property.
Adjustment
Using this property, the time can be adjusted by a manually given value. Adjustments can be positive or negative and can be given in milliseconds, seconds, minutes, hours, days, weeks, months, quarters, years.
Output Format and Locale
These two properties in combination define the output format emitted in the output msg
.
Output Format
The Output Format property defines the format and is described in the moment.js displaying format section.
It may be any format string defined by moment.js. The formatting additions from moment-timezone are also allowed. In addition, further (not case sensitive, alternatives in brackets) format strings are also allowed.
Note that with the exception of ISO8601, other formats are in the specified timezone & DST. If not specified, the output timezone/DST is the same as the input.
Use an output timezone of UTC to force output to that.
Format string defined by moment.js
The format string defined by moment.js basically has two options:
Manual given format string: This is a string where the time/date parts are represented by characters. Also text parts are allowed. Examples:
"DD.MM.YYYY HH:mm" gives 20.09.2020 08:30
"dddd, MMMM Do YYYY, h:mm:ss a" gives Sunday, February 14th 2010, 3:25:50 pm
"[Today is] dddd" gives Today is Sunday
"[Date: ]YYYY-MM-DD [Time: ]HH:mm:ss" gives Date: 2020-09-20 Time: 08:31:45
"fromNow" gives in a month
"calendar" gives Last Monday
Predefined localized string: This is a string which defines a localized format. Examples:
"LLL" gives October 20, 2020 8:33 AM
"LTS" gives 8:30:25 PM
"llll" gives Thu, Sep 4, 1986 8:30 PM
For more options see https://momentjs.com/docs/#/displaying/format/.
Format string is left blank resp. is "ISO8601" or "ISO"
In this case the output is in ISO 8602 format, e.g. "2015-01-28T16:24:48.123Z".
Note that ISO8601 formatted output is ALWAYS in UTC ('Z', Zulu time) not local, no matter what output timezone you may specify.
See also moment().toISOString()
.
Format string is "date" resp. "jsDate"
This is a Javascript Date object in the form {years:nnnn, months:n, date:n, hours:n, minutes:n, seconds:n, milliseconds:n}
.
It may be used for manual (fixed) data/time values.
WARNING: moment.js has a bizarre object format where the month is zero-based (0-11) instead of 1-based (1-12) like all the other elements are. I don't currently know why, I've raised an upstream issue but this appears to be a deliberate decision for some strange reason.
See also moment().toObject()
.
Format string is "fromNow" resp. "timeAgo"
This is a human readable output, e.g. 30 minutes ago or in a month (only rough time spans are given in this output format type, see also the humanizer example below). The time span is derived from the actual time and the time fed into the node.
See also moment().fromNow()
.
Format string is "calendar" resp. "aroundNow"
This is a human readable alternative, e.g. Last Monday or Tomorrow 2:30pm. Note that dates beyond a week from now are output as yyyy-mm-dd.
See also moment().calendar()
.
Format string is "date" resp. "jsDate"
This output format type is actually not working (see issue #37).
Locale
In case of a textual output string contents the Locale property defines the language of the textual parts (e.g. "October" vs. "Oktober" vs. "ottobre" vs. "lokakuuta").
If the output is shown in the wrong format, such as dates in US mm/dd/yy format, change the output locale. For example, using en_gb will force short dates to output in dd/mm/yy format. The default is en which moment assumes means the USA :-(
See also Locale Helper (Note: Not every locale given there is supported).
Topic (additional topic)
Using this property you can add an additional topic to the output msg.topic
. A resulting msg
may be (value "myTopicString"):
{"_msgid":"b16b00b5.bada55","payload":"2020-09-20T12:47:55.143Z","topic":"myTopicString"}
Input of node moment
Input values in the object Input from can be of the following types:
timestamp: The current date/time is used as input.
msg, global or flow and the given property is empty or does not exist: The current date/time is used as input.
JSON date time object: This data time object may contain the following elements: years, months, days, hours, minutes, seconds, milliseconds.
Example:
{"years":2020,"months":1,"date":11,"hours":5,"minutes":6}
.If elements are not given (e.g. years and months are missing in the object) the actual time values are used instead.
a property containing a string that is a recognizable date/time: The value will be interpreted and processed.
Example:
2020-02-11T05:06
a property containing a numeric value: The value will be assumed to be a UNIX time value (ms since 1970-01-01). Remark: This is the format which the node Inject emits at option timestamp.
a property containing a string that is not a recognisable date/time (including
null
): Then no conversion takes place, the output will be an empty string plus a debug warning.
Note that parsing date/time strings is a hard problem. moment.parseFormat helps but it isn't magic. We assume that ambiguous input dates such as 3/5/05 are in EU/UK format dd/mm/yy unless either the input timezone is in America or the locale is set to en_US.
Outputs of node moment
If the output property is not msg.payload
the input msg.payload
is retained in the output.
The date/time output is a formatted string if the configuration property Output Format is anything other than date resp. jsDate or object in which case the output is a Javascript date object or an object as described below respectively.
Output string formatting is controlled by the Locale and the Output Format setting. Note that the output Timezone is ignored for ISO8601 output (the default), such output is always in UTC. For other formats, the output will be in the specified timezone which defaults to your host timezone.
Specifying different input and output timezones allows you to translated between them.
The output msg
will pass through the input msg.topic
unless it is overridden by the Topic configuration property. If the Output to field is changed from the default msg.payload
, the input msg.payload
will also be passed through.
Usage of node humanizer
This node converts an input time span to a humanized text string to the output msg.payload.humanized
. The language of the output string is derived from the locale of the system, i.e. it is not changeable (like the Locale property of the moment node).
See also moment.duration().humanize().
(Contributed by Laro88)
Configuration of node humanizer
Fig. 4: Properties of node humanizer
'Input variable'
This property defines the input msg.payload
property which shall be used for the conversion. If left blank, msg.payload
is used.
Input of node humanizer
The input is a number which defines a time span in seconds.
Outputs of node humanizer
The output is a string object in msg.payload.humanized
.
The time spans are evaluated in intervals, see humanizer example for details.
Examples
Remark: Example flows are present in the examples subdirectory. In Node-RED they can be imported via the import function and then selecting Examples in the vertical tab menue.
All example flows can also be found in the examples folder of this package.
Usage of the moment node
The basic usage is shown in Fig. 2. The following examples shall give an overview how to use the rich configuration properties.
Usage of configuration properties Output Timezone, Output Format and Adjustment
A sample flow is:
output-timezone-format-adjustment flow
Fig. 5: Example flow showing the usage of Output Timezone, Output Format and Adjustment
Usage of configuration property Input Timezone
A sample flow is:
input-timezone flow
Fig. 6: Example flow showing the usage of Input Timezone
Usage of configuration properties Output Format and Locale
A sample flow is:
output-format-locale flow
Fig. 7: Example flow showing the usage of Output Format and Locale
Usage of the humanizer node
A sample flow is:
humanizer flow
Fig. 8: Example flow showing the usage of the humanizer node
Depends on
- Moment.js - Clever date/time handler for Node.js and browsers
- Moment-Timezone - Adds timezone and locale awareness to Moment.js
- Zulu time format
- Timezones (tzdata)
- Moment-ParseFormat - Tries to interpret input strings as date/times and creates a format string that moment.js can use.
- Locale Helper - lists locale options
- Node-RED - of course!
To Do
Summary of things I'd like to do with the moment node (not necessarily immediately):
[ ] Add some additional nodes for doing date/time calculations - partly complete, can do simple add/subtract from main node
[ ] Add additional node for doing duration calculations
[ ] Add a combo box to the Format field with common formats pre-populated
[x] Improve the error messages when Moment.JS fails to interpret the input (say why)
[x] Allow more input date/time formats - turns out Moment.JS doesn't really help here. At present, I see too many input failures from US/UK date formats, etc. It would be great if I could parse "human" inputs like "tomorrow" and "2 minutes from now". We can output them now but not input them. As of v1.0.5, a localisation parameter is supported.
~~Partly complete: Added the parseFormat plugin. That failed, see code for details.~~ Now complete.
License
This code is Open Source under an Apache 2 License. Please see the apache2-license.txt file for details.
You may not use this code except in compliance with the License. You may obtain an original copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Please see the License for the specific language governing permissions and limitations under the License.
Author
Julian Knight (Totally Information), https://github.com/totallyinformation
Contributors/Credits
Many thanks for the contributions.
Feedback and Support
Please report any issues or suggestions via the Github Issues list for this repository.
For more information, feedback, or community support see the Node-RED Google groups forum at https://groups.google.com/forum/#!forum/node-red