ISODate 转换成本地的时间的函数

本文介绍了一个将MongoDB中ISODate格式的时间字符串转换为本地时间的方法。通过正则表达式验证输入格式,然后去除时间字符串中的特定字符,并使用SimpleDateFormat进行日期格式化。最后通过Calendar类调整得到本地时间。

ISODate 转换成本地的时间的函数

大家知道,mongoDB的日期字符格式是类似这样的格式
2014-02-28T05:01:38.904Z

那这样的格式怎么转换成本地的时间呢。

    public static Date formatDate(String time){
        SimpleDateFormat sdf =   new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            return sdf.parse(time);
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
    }
    public static Date fromISODate(String time){
        if(!time.matches("\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}Z")){
            return null;
        }
        time=time.replaceFirst("T", " ").replaceFirst(".\\d{3}Z", "");
        Date date=formatDate(time);
         // 1、取得本地时间:
        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.setTime(date);

        // 2、取得时间偏移量:
        int zoneOffset = cal.get(java.util.Calendar.ZONE_OFFSET);
        // 3、取得夏令时差:
        int dstOffset = cal.get(java.util.Calendar.DST_OFFSET);
        // 4、从本地时间里扣除这些差量,即可以取得UTC时间:
        cal.add(Calendar.MILLISECOND, (zoneOffset + dstOffset));
        return cal.getTime();
    }
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub       

        Date dateUtc=fromISODate("2014-02-28T05:01:38.904Z");
        System.out.println(dateUtc);

    }

运行结果

<think>好的,我现在需要解决用户的问题,即查找PostgreSQL和MySQL中通用的时间格式化函数。用户之前已经询问过如何兼容两者的DATE_FORMAT函数,现在进一步想了解有哪些时间格式化函数是两者通用的。 首先,我需要回忆之前给出的回答,其中提到在PostgreSQL中创建自定义函数来模拟MySQL的DATE_FORMAT,而MySQL则原生支持。用户现在可能希望不依赖自定义函数,直接使用两者都支持的函数。 接下来,我需要查阅PostgreSQL和MySQL的官方文档,确认各自的时间格式化函数。已知PostgreSQL使用TO_CHAR,而MySQL使用DATE_FORMAT。这两个函数名称不同,但功能相似。是否有其他函数是两者都支持的? 常见的时间格式化需求包括将日期换为字符串,或者提取特定部分。例如,ISO 8601格式(如YYYY-MM-DD HH:MM:SS)可能在两者中都有默认支持。例如,DATE类型的隐式换可能在简单情况下不需要函数,直接使用字符串输出。但用户可能需要更灵活的格式化。 需要检查两者是否有共同的函数,比如EXTRACT函数,用于提取年、月、日等部分。例如,EXTRACT(YEAR FROM date_column)在两种数据库中都是支持的。这可能是一个通用方法,但只能提取单个部分,无法组合成特定格式。 另外,标准SQL函数如CURRENT_TIMESTAMP在两者中都存在,但返回的是日期时间类型,不是格式化后的字符串。CAST函数可以将日期为字符串,但格式固定,无法自定义。例如,CAST(date_column AS VARCHAR)在PostgreSQL中可能得到默认格式,而MySQL中可能不同。 所以,可能没有完全通用的时间格式化函数,但可以通过一些方法实现类似效果。例如,使用TO_CHAR和DATE_FORMAT时,通过统一格式字符串中的模式,或者使用标准SQL的CAST结合EXTRACT来拼接字符串。 此外,用户可能需要考虑使用应用层处理格式化,而不是依赖数据库函数,但这可能影响性能。或者,在SQL中使用CASE语句或字符串拼接,结合EXTRACT函数来手动构建格式,但这样会比较繁琐。 还需要注意,用户在之前的回答中已经创建了自定义函数来统一DATE_FORMAT,这可能是一个解决方案,但用户现在想知道是否有原生的通用函数。如果没有,可能需要告知用户只能通过上述方法实现,或者依赖应用层处理。 最后,总结可能的通用方法:使用EXTRACT提取各部分并拼接,或者利用CAST和隐式换,但格式受限。或者接受使用不同的函数名,但在格式字符串上保持一致,如使用ISO标准格式,这样两种数据库都能正确解析和显示。</think>### PostgreSQL与MySQL通用时间格式化方法解析 在PostgreSQL和MySQL中,虽然原生日期格式化函数名称不同(PostgreSQL用${\tt TO\_CHAR}$,MySQL用${\tt DATE\_FORMAT}$),但可以通过**标准化格式字符串**和**通用函数组合**实现兼容效果。以下是两种数据库均可使用的三类通用方法: --- #### 一、ISO 8601标准格式隐式换 直接返回日期类型时会自动换为标准格式字符串,两种数据库输出结果一致: ```sql -- 通用查询 SELECT create_time FROM orders WHERE id = 1; ``` **输出示例**: ``` 2024-03-15 14:30:45 -- 隐式换为YYYY-MM-DD HH24:MI:SS格式 ``` **适用场景**: 快速获取标准时间格式且无需特殊格式时优先使用,性能最优[^1]。 --- #### 二、EXTRACT函数组合拼接 通过提取日期元素并拼接字符串实现格式化,语法完全兼容: ```sql -- 通用年月日格式化 SELECT id, EXTRACT(YEAR FROM create_time) || &#39;-&#39; || LPAD(EXTRACT(MONTH FROM create_time)::text, 2, &#39;0&#39;) || &#39;-&#39; || LPAD(EXTRACT(DAY FROM create_time)::text, 2, &#39;0&#39;) AS date_str FROM orders; ``` **输出示例**: ``` | id | date_str | |----|--------------| | 1 | 2024-03-15 | ``` **扩展用法**: ```sql -- 带时分秒的拼接(需注意类型换) SELECT EXTRACT(HOUR FROM create_time) || &#39;:&#39; || LPAD(EXTRACT(MINUTE FROM create_time)::text, 2, &#39;0&#39;) AS time_part FROM orders; ``` --- #### 三、CAST函数基础换 将日期类型强制换为字符串类型,但格式受数据库默认设置影响: ```sql -- 通用类型换 SELECT CAST(create_time AS VARCHAR) AS default_format FROM orders; ``` **输出差异**: - PostgreSQL:${\tt &#39;2024-03-15 14:30:45&#39;}$ - MySQL:${\tt &#39;2024-03-15 14:30:45&#39;}$(版本8.0+) *注意:MySQL 5.7可能输出${\tt &#39;2024-03-15 14:30:45&#39;}$不带毫秒* --- ### 方法对比与选型建议 | 方法 | 优点 | 缺点 | 适用场景 | |--------------------|-------------------------------|-------------------------------|--------------------------| | ISO隐式换 | 零开发成本,性能最优 | 格式固定 | 标准化时间输出 | | EXTRACT拼接 | 完全跨数据库兼容 | 代码冗余,维护成本高 | 简单日期元素组合 | | CAST换 | 语法简单 | 格式不可控,存在版本差异 | 快速获取默认字符串 | | 自定义函数映射[^2] | 保持语法统一,支持复杂格式 | 需预先部署PostgreSQL函数 | 高频使用复杂格式的场景 | --- ### 高级兼容方案 若需要更灵活的格式化,推荐以下组合方案: **1. 标准化格式模板** 在应用层定义格式常量,按数据库类型选择函数: ```sql /* 伪代码示例 */ format_str = &#39;%Y-%m-%d %H:%i:%s&#39; -- 应用层统一定义 -- PostgreSQL执行 SELECT TO_CHAR(create_time, &#39;YYYY-MM-DD HH24:MI:SS&#39;) FROM orders; -- MySQL执行 SELECT DATE_FORMAT(create_time, &#39;%Y-%m-%d %H:%i:%s&#39;) FROM orders; ``` **2. 动态SQL生成** 通过框架识别数据库类型自动切换函数: ```python # Python SQLAlchemy示例 if dialect == &#39;postgresql&#39;: stmt = select([func.to_char(orders.c.create_time, &#39;YYYY-MM-DD HH24:MI:SS&#39;)]) elif dialect == &#39;mysql&#39;: stmt = select([func.date_format(orders.c.create_time, &#39;%Y-%m-%d %H:%i:%s&#39;)]) ``` --- ### 验证示例 **场景**:获取"年-月"格式统计订单数量 ```sql -- PostgreSQL SELECT TO_CHAR(create_time, &#39;YYYY-MM&#39;) AS month, COUNT(*) AS order_count FROM orders GROUP BY month; -- MySQL SELECT DATE_FORMAT(create_time, &#39;%Y-%m&#39;) AS month, COUNT(*) AS order_count FROM orders GROUP BY month; ``` **统一输出**: ``` | month | order_count | |-----------|-------------| | 2024-03 | 152 | ``` --- ### 注意事项 1. **时区一致性**: 使用${\tt AT TIME ZONE}$(PostgreSQL)和${\tt CONVERT\_TZ}$(MySQL)确保时间基准统一[^2]: ```sql -- PostgreSQL TO_CHAR(create_time AT TIME ZONE &#39;Asia/Shanghai&#39;, &#39;YYYY-MM-DD HH24:MI:SS&#39;) -- MySQL DATE_FORMAT(CONVERT_TZ(create_time, &#39;UTC&#39;, &#39;Asia/Shanghai&#39;), &#39;%Y-%m-%d %H:%i:%s&#39;) ``` 2. **性能影响**: - 避免在WHERE条件中使用格式化函数,可能导致索引失效[^2] - 复杂格式化建议在应用层完成 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值