寻求匹配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
相关产品推荐
相关产品推荐

