我正在寻找一种纯Ruby的方法,该方法采用时区字符串(例如“ US / Eastern”),并将其与时间戳的字符串表示形式一起使用,以转换为带有时区的时间戳。
我到目前为止发现的所有内容都strptime
支持短时区名称(如“ EST”)或时区偏移量(如“ -0500”),但不支持完整的时区字符串。
我需要能够将它作为Logstash红宝石过滤器的一部分运行。我有一些JSON,其中包含没有时区的时间戳,如下所示:
{
"event": {
"created": "2021-02-15_11-26-29",
},
"Accounts": [
{
"Name": "operator",
"Caption": "SERVER\\operator",
"Domain": "SERVER",
"PasswordChangeable": "False",
"PasswordRequired": "True",
"PasswordExpires": "False",
"Disabled": "False",
"Lockout": "False",
"LocalAccount": "True",
"FullName": "operator",
"Status": "OK",
"LastLogon": "07/08/2020 2:14:13 PM"
},
...
]
}
对于event.created字段,我可以使用date
过滤器:
date {
match => [ "[event][created]", "yyyy-MM-dd_HH-mm-ss" ]
timezone => "${TIMEZONE}"
target => "[event][created]"
}
其中${TIMEZONE}
的环境变量包含完整的时区名称,即“ US / Eastern”。但是对于Acounts.LastLogin字段,我无法使用date
过滤器,因为它位于可变长度的列表中,因此我不得不求助于ruby过滤器。我能找到的最接近的是:
ruby {
code => 'event.get("[Accounts]").each_index {|x|
tz = "-0500"
last_logon_str = event.get("[Accounts][#{x}][LastLogon]")
last_logon = DateTime.strptime(last_logon_str + " " + tz, "%m/%d/%Y %I:%M:%S %p %z")
event.set("[users][#{x}][last_logon]", last_logon.strftime("%Y-%m-%dT%H:%M:%S%z"))
}'
}
但这当然是使用硬编码的时区偏移量,而不是包含全名的变量。
我Time
在https://ruby-doc.org/core-2.6/Time.html上寻找对象的文档指出,Time
可以使用来创建对象timezone
:
或时区对象:
tz = timezone("Europe/Athens") # Eastern European Time, UTC+2 Time.new(2002, 10, 31, 2, 2, 2, tz) #=> 2002-10-31 02:02:02 +0200
然后可以用来提取偏移量,但是找不到timezone
任何地方的引用。
处理此问题的最佳方法是什么?
时区是TZInfo类的一部分。您需要它。以下代码
ruby {
code => '
require "tzinfo"
tz = TZInfo::Timezone.get(ENV["TIMEZONE"])
event.set("offset", tz.observed_utc_offset())
'
}
"offset" => -18000,
当$ TIMEZONE是“ US / Eastern”时,我会收到。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句