首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何捕捉以UTC为基础的事件,如果它们超过了特定的时区?

如何捕捉以UTC为基础的事件,如果它们超过了特定的时区?
EN

Stack Overflow用户
提问于 2017-10-24 21:17:09
回答 1查看 81关注 0票数 0

拥有一个MySQL数据库,其默认时区是Linux上的系统时区,即UTC。

代码语言:javascript
运行
复制
CREATE TABLE `event_schedule` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `description` varchar(30) DEFAULT NULL,
   `event_id` varchar(30) NOT NULL DEFAULT,
   `event_type_id` varchar(30) NOT NULL DEFAULT,
   `event_date` datetime DEFAULT NULL,
   `event_date_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
)

内容如下:

代码语言:javascript
运行
复制
| 1 | karoake | aab3223  | 2  |  2017-08-15 00:00:00 | 2017-08-15 16:00:00 |
| 2 | comedy  | cce8465  | 3  |  2017-08-25 00:00:00 | 2017-08-25 19:00:00 | 

在Spring查询中,我得到了如下所示的当前事件:

代码语言:javascript
运行
复制
private String getEventIdFromEventDay(String eventTypeId) {
    String eventId = "";
    SqlRowSet resultSet = null;

    try {
        resultSet = jdbcTemplate.queryForRowSet(
                "select * from event_schedule where event_date >= CURDATE() and event_type_id=? order by event_date limit 1;",
                new Object[] { eventTypeId });
        if (resultSet != null && resultSet.next()) {
                eventId = resultSet.getString("event_id");
            }
        }
    } 
    catch (Exception e) {
        logger.error("Exception om getEventIdFromEventDay: " + e);
    }
    return eventId;
}

所以,情况是:

  • 如果某一事件发生在某一天,例如,如果喜剧性事件发生在2017-08-24,从晚上7:00开始。在我的数据库中它是在UTC时间: + 2017-08-25 00:00:00 所以,每次下午5点开始的活动。PST,或之后,此查询工作。
  • 然而,假设一个活动开始于2017-08-15 :00下午4点。PST (也就是说现在是晚上11点)。( UTC),此查询只能工作到下午4:59。因为在下午5点,MySQL中的系统时钟变成了午夜(导致第二天)。解决这一问题的唯一方法是手动将该日期更新到第二天( 2017-08-16 ),这样这个查询才能正常工作。

我想知道是否有更好的问题来问我想做什么.

试过这个:

代码语言:javascript
运行
复制
select * from event_schedule where CONVERT_TZ(event_date,'+00:00','-07:00') >= CONVERT_TZ(CURDATE(),'+00:00','-07:00') and CONVERT_TZ(TIMESTAMP(event_date, '23:59:59'),'+00:00','-07:00') <= CONVERT_TZ(TIMESTAMP(CURDATE(), '23:59:59'),'+00:00','-07:00') and event_type_id = "2";

收益如下:

代码语言:javascript
运行
复制
Empty set (0.00 sec)

有人知道我怎么解决这个问题吗?

阅读了Basil的建议后编辑了

在我的文件中使用ThreeTen-Backport库,并尝试如下:

代码语言:javascript
运行
复制
// Get current time in UTC
Instant now = Instant.now();

// Get time zone in PST
ZoneId pstTimeZone = ZoneId.of("America/Los_Angeles");

// Adjust into that time zone from UTC, producing a ZonedDateTime object.
ZonedDateTime adjustedZDTimeZoneFromUtc =now.atZone(pstTimeZone);

// Extract Date Only Value
LocalDate localDate = adjustedZDTimeZoneFromUtc.toLocalDate();

// Determine the first moment of the following day for that timezone
ZonedDateTime zdt = localDate.plusDays(1).atStartOfDay(pstTimeZone);

// Adjust back to UTC from that Time Zone
Instant firstMomentOfTomorrow = zdt.toInstant();
System.out.println("\n\n\t\tFirst moment of tomorrow: " + firstMomentOfTomorrow + "\n\n");

这是输出:

代码语言:javascript
运行
复制
First moment of tomorrow: 2017-10-25T07:00:00Z

因此,当尝试在原始SQL调用中使用明天日期的第一分钟时(以便在将其放入Java代码中之前对其进行测试):

代码语言:javascript
运行
复制
SELECT * FROM event_schedule WHERE event_date >= now() AND event_date <= "2017-10-25T07:00:00Z";

它产生:

代码语言:javascript
运行
复制
Empty set, 1 warning (0.00 sec)

像这样尝试了Basil的查询:

代码语言:javascript
运行
复制
SELECT * FROM event_schedule WHERE when >= now() AND when < "2017-10-25T07:00:00Z";

收益如下:

代码语言:javascript
运行
复制
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'when >= now() AND when < "2017-10-25T07:00:00Z"' at line 1

问题:

  1. 难道不是MySQL大师吗?“什么时候”是一个可以使用的关键字?
  2. 我是否应该为每一行创建一个名为first_moment_of_tomorrow的列,并在事件表中进行日期范围检查?

select now()curdate()的问题是,现在用实际秒返回实际日期,而event_date则采用如下格式:

代码语言:javascript
运行
复制
2017-08-15 00:00:00 

因此,当尝试curdate时:

代码语言:javascript
运行
复制
select curdate();

产生这样的结果:

代码语言:javascript
运行
复制
+------------+
| curdate()  |
+------------+
| 2017-10-24 |
+------------+
1 row in set (0.01 sec)

现在()尝试时:

代码语言:javascript
运行
复制
select now();

产生这样的结果:

代码语言:javascript
运行
复制
+---------------------+
| now()               |
+---------------------+
| 2017-10-24 18:27:37 |
+---------------------+
1 row in set (0.00 sec)

有谁知道问题是什么吗?我需要对event_schedule.event_date执行某种类型的SQL查询,但现在有点困惑.:(

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-29 20:23:44

通过将时区加载到MySQL 5中并将查询更改为:

代码语言:javascript
运行
复制
select * from event_schedule where event_id=? and bye_week=0 and date(convert_tz(event_date_time,'UTC','US/Pacific'))=date(convert_tz(now(), @@system_time_zone, 'US/Pacific'))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46920148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档