获取基于 UTC 的未来事件的本地时间
Getting local time for future events based off UTC
我正在编写一个脚本,该脚本将在社区 Google 日历(使用东部时区)中查找事件并将其成功转换为本地用户的时区。因为它是一个社区 Google 日历,所以我无法将时间设置为显示为 UTC,这在理论上会使这更容易。这是我尝试创建的分步过程:
- 从 Google 日历中获取事件时间(东部时间)。使用 API 和 json 格式很容易做到这一点。
- 使用 Google 地图 API 根据事件时间获取东部时区偏移量。同样,这很容易做到。
- 将事件时间从东部时间转换为 UTC,我认为这是通过将偏移量添加到事件时间来完成的。
- 根据未来日期计算当地timezone/UTC时区差异。
- Return 通过将步骤 4 的结果添加到 UTC 事件的时间来获得事件的本地时间。
但是,无论我做什么,它似乎都无法按照我想要的方式工作。这是目前的代码:
local function get_local_time(dateTime)
local xyear, xmonth, xday = string.match(dateTime, "(%d+)%-(%d+)%-(%d+)") -- Date format is displayed as yyyy-mm-dd
local xhour, xmin = string.match(dateTime, "%a(%d+):(%d+)") -- Time format is displayed as Thh:mm
local event_time = os.time({year = xyear, month = xmonth, day = xday, hour = xhour or 23, min = xmin or 59, sec = 0}) -- Gets epoch time for event time
async_ok, async = pcall (require, "async") -- Asynchronous lookup functions
if not json then json = require 'json' end
tzpage = "https://maps.googleapis.com/maps/api/timezone/json?location=28.4158,-81.2989×tamp=" .. event_time .. "&key=" .. key -- Gets offset data for Eastern Time Zone
if async_ok then
tzrpage = async.request(tzpage, "HTTPS")
end
retval, page, status, headers, full_status = tzrpage:join()
tzrpage = nil
if status == 200 then
tzopage = json.decode(page)
end
local eastern_offset = tzopage.rawOffset+tzopage.dstOffset -- Adds the offset information together (includes Daylight Savings)
local utc_event_time = event_time+eastern_offset -- Sets UTC's time for the event
local utctime, localtime = os.date("!*t", utc_event_time), os.date("*t", utc_event_time) -- Sets table data for events based on UTC's time of the event
localtime.isdst = false
local localoffset = os.difftime(os.time(utctime), os.time(localtime)) -- Sets the time difference between UTC and local time at the time of the event UTC
return os.date("%A, %B %d %Y at %I:%M%p", (utc_event_time-localoffset)) -- Should return local time of the event
end
但是当我执行以下操作时:
print(get_local_time("2015-10-31T01:15:00"))
它returns
Friday, October 30 2015 at 02:15PM
何时返回
Friday, October 30 2015 at 10:15PM
因为我是太平洋时间。
如果我改变
return os.date("%A, %B %d %Y at %I:%M%p", (utc_event_time-localoffset))
到
return os.date("%A, %B %d %Y at %I:%M%p", (utc_event_time+localoffset))
我明白了
Saturday, October 31 2015 at 04:15AM
这又是不正确的。
这个脚本哪里出错了?作为旁注,异步是客户端依赖项,但它本质上是 http.request
.
Convert the Event time from Eastern to UTC, which I believe is done by adding the offset to the Event time.
减法。
时间戳中显示的偏移量是一个带符号的数字。已经"added"到UTC生成本地时间,所以逆运算就是减去它。由于 -0400
为负数,您需要减去负数 4 小时才能转换回 UTC。
我正在编写一个脚本,该脚本将在社区 Google 日历(使用东部时区)中查找事件并将其成功转换为本地用户的时区。因为它是一个社区 Google 日历,所以我无法将时间设置为显示为 UTC,这在理论上会使这更容易。这是我尝试创建的分步过程:
- 从 Google 日历中获取事件时间(东部时间)。使用 API 和 json 格式很容易做到这一点。
- 使用 Google 地图 API 根据事件时间获取东部时区偏移量。同样,这很容易做到。
- 将事件时间从东部时间转换为 UTC,我认为这是通过将偏移量添加到事件时间来完成的。
- 根据未来日期计算当地timezone/UTC时区差异。
- Return 通过将步骤 4 的结果添加到 UTC 事件的时间来获得事件的本地时间。
但是,无论我做什么,它似乎都无法按照我想要的方式工作。这是目前的代码:
local function get_local_time(dateTime)
local xyear, xmonth, xday = string.match(dateTime, "(%d+)%-(%d+)%-(%d+)") -- Date format is displayed as yyyy-mm-dd
local xhour, xmin = string.match(dateTime, "%a(%d+):(%d+)") -- Time format is displayed as Thh:mm
local event_time = os.time({year = xyear, month = xmonth, day = xday, hour = xhour or 23, min = xmin or 59, sec = 0}) -- Gets epoch time for event time
async_ok, async = pcall (require, "async") -- Asynchronous lookup functions
if not json then json = require 'json' end
tzpage = "https://maps.googleapis.com/maps/api/timezone/json?location=28.4158,-81.2989×tamp=" .. event_time .. "&key=" .. key -- Gets offset data for Eastern Time Zone
if async_ok then
tzrpage = async.request(tzpage, "HTTPS")
end
retval, page, status, headers, full_status = tzrpage:join()
tzrpage = nil
if status == 200 then
tzopage = json.decode(page)
end
local eastern_offset = tzopage.rawOffset+tzopage.dstOffset -- Adds the offset information together (includes Daylight Savings)
local utc_event_time = event_time+eastern_offset -- Sets UTC's time for the event
local utctime, localtime = os.date("!*t", utc_event_time), os.date("*t", utc_event_time) -- Sets table data for events based on UTC's time of the event
localtime.isdst = false
local localoffset = os.difftime(os.time(utctime), os.time(localtime)) -- Sets the time difference between UTC and local time at the time of the event UTC
return os.date("%A, %B %d %Y at %I:%M%p", (utc_event_time-localoffset)) -- Should return local time of the event
end
但是当我执行以下操作时:
print(get_local_time("2015-10-31T01:15:00"))
它returns
Friday, October 30 2015 at 02:15PM
何时返回
Friday, October 30 2015 at 10:15PM
因为我是太平洋时间。
如果我改变
return os.date("%A, %B %d %Y at %I:%M%p", (utc_event_time-localoffset))
到
return os.date("%A, %B %d %Y at %I:%M%p", (utc_event_time+localoffset))
我明白了
Saturday, October 31 2015 at 04:15AM
这又是不正确的。
这个脚本哪里出错了?作为旁注,异步是客户端依赖项,但它本质上是 http.request
.
Convert the Event time from Eastern to UTC, which I believe is done by adding the offset to the Event time.
减法。
时间戳中显示的偏移量是一个带符号的数字。已经"added"到UTC生成本地时间,所以逆运算就是减去它。由于 -0400
为负数,您需要减去负数 4 小时才能转换回 UTC。