当前位置: 首页 > news >正文

使用Presto、Trino数据库时提示“The datetime zone id ‘GMT+08:00‘ is not recognised”

出现这个问题的原因是:Presto、Trino的驱动使用了joda这个库来处理时区的问题。但这个库的编写人似乎对java zone的格式没有太多经验。先看一下出错的代码:

com.facebook.presto.jdbc.internal.joda.time.DateTimeZone#forID

根据String类型的zoneId转成DateTimeZone。如果未设置使用默认的。如果设置了,则先判断是否是UTC的,是的话则直接使用UTC处理。然后使用Provider的getZone()方法获取。如果没有取到的话,根据zoneId是否是+,-开头,手动计算时区。这里的问题就在于,国内写代码时,大家一般都是这么写的:

TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("GMT+8")));

会导致上面的所有判断没有命中,直接进入最后的异常抛出。

解决办法:

1、通过下面的语句可以避免异常。如果程序中能够兼容“+08:00”这种时区格式,可以直接在代码中设置。这种设置是全局性的,一旦调整,整个程序都有影响。如果有逻辑不兼容这种格式,那么这种方法是不通用的。

TimeZone.setDefault(TimeZone.getTimeZone("+08:00"));

或者:TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));

2、也可以试试不设置任何TimeZone,保持程序和环境默认。

3、最后还有一种,上面的代码中使用getProvider(), joda库本身只实现了两种,一个是UTC,顾名思义专门处理UTC时区;一个是ZoneInfoProvider,通过读取com.facebook.presto.jdbc.internal.joda.time/tz/data下的配置文件实现。看了一下里面是有shanghai的配置的。这个Provider是可以拓展的。我们可以增加一个自己的实现,来最小化数据库驱动对整个程序的影响。

示例代码:

DateTimeZone.setProvider(new Provider() {
    @Override
    public DateTimeZone getZone(String id) {
        if (id.equals("UTC")) {
            return DateTimeZone.UTC;
        }

        if (id.startsWith("GMT+08:00")) {
            return DateTimeZone.forTimeZone(TimeZone.getTimeZone("+08:00"));
        }

        return null;
    }

    @Override
    public Set<String> getAvailableIDs() {
        return new TreeSet<String>() {
            {
                add("UTC");
                add("GMT+8");
            }
        };
    }
});

如果是Spring Boot程序,在main方法时调用即可。

http://www.lryc.cn/news/116499.html

相关文章:

  • C# BeginInvoke 加 EndInvoke实现异步操作
  • “华为杯”研究生数学建模竞赛2015年-【华为杯】B题:数据的多流形结构分析(续)
  • R语言APSIM模型高级应用及批量模拟
  • 【硬件设计】模拟电子基础三--集成运算放大电路
  • JavaWeb(11)——前端综合案例5(小黑记事本)
  • 在使用TensorFlow的时候内部报错:内部某个方法或属性不存在
  • dubbo之高可用
  • gitee代码扫描js代码,降低复杂度,减少if-else判断的处理方法
  • MySQL及SQL语句(3)
  • MySQL 查询语句大全
  • 【Axure高保真原型】账单列表和详情
  • 嵌入式面试题1
  • base64转二进制流,file文件
  • 各种查找算法的效率分析
  • 微报告下载!市场不确定性周期下的激光雷达前装赛道
  • Java版企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis tbms
  • 并网逆变器学习笔记6---三电平SVPWM下的连续和不连续调制
  • TS协议之PES(ES数据包)
  • 银河麒麟V10 SP3 X86 二进制文件部署 mysql-5.7.29 GTID 半同步复制的双主架构
  • python爬虫3:requests库-案例1
  • 计算机网络 数据链路层 媒体接入控制
  • 面部表情识别(Pytorch):人脸检测模型+面部表情识别分类模型
  • 外卖点餐小程序开源源码——支持扫码点餐
  • 十分钟掌握使用 SolidJS 构建全栈 CRUD 应用程序
  • LabVIEW开发多材料摩擦电测量控制系统
  • 【Linux】网络基础1
  • HTML - Javascript - 原生的JS HTTP请求:实用主义的一篇文章
  • Intellij IDEA运行报Command line is too long的解决办法
  • 信号槽传输过程中指针所指对象的生命周期
  • c++ 递归锁的使用