You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求匹配PostgreSQL dow星期编号规则的Java官方常量

适配PostgreSQL EXTRACT(dow) 规则的Java方案

刚好我之前也梳理过这个问题:PostgreSQL的EXTRACT(dow)返回的星期编号是0=周日、1=周一,一直到6=周六,但Java标准库(包括新版的日期API)并没有直接提供完全匹配这个规则的官方常量。不过我们可以通过现有工具转换,或者简单封装来解决:

1. Java 8+ 新版日期API(java.time包)

新版的DayOfWeek枚举遵循ISO标准——周一(MONDAY)对应1,周日(SUNDAY)对应7。要转换成PostgreSQL的规则,只需要取模7就行:

// 示例转换
DayOfWeek sunday = DayOfWeek.SUNDAY;
int pgDow = sunday.getValue() % 7; // 得到0,和PostgreSQL一致
DayOfWeek monday = DayOfWeek.MONDAY;
pgDow = monday.getValue() % 7; // 得到1

2. 旧版java.util.Calendar类

如果还在使用旧的Calendar类,它的星期常量是Calendar.SUNDAY=1、Calendar.MONDAY=2……Calendar.SATURDAY=7,转换成PostgreSQL规则只需要减1:

int pgSunday = Calendar.SUNDAY - 1; // 0
int pgMonday = Calendar.MONDAY - 1; // 1

3. Apache Commons 库

如果你用Apache Commons Lang 3的日期工具类,比如DateUtils,底层还是基于Calendar的规则,所以转换方式和上面一样——减1就能得到PostgreSQL风格的编号,这个库也没有直接提供对应规则的常量。

如果需要在代码里频繁使用,最好自己封装一个枚举类来对应,这样更直观:

public enum PgDayOfWeek {
    SUNDAY(0),
    MONDAY(1),
    TUESDAY(2),
    WEDNESDAY(3),
    THURSDAY(4),
    FRIDAY(5),
    SATURDAY(6);

    private final int pgDowValue;

    PgDayOfWeek(int pgDowValue) {
        this.pgDowValue = pgDowValue;
    }

    public int getPgDowValue() {
        return pgDowValue;
    }
}

之后直接用PgDayOfWeek.SUNDAY.getPgDowValue()就能拿到和PostgreSQL完全匹配的数值了。

内容的提问来源于stack exchange,提问作者vektor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:21:34