首页 > 解决方案 > 在数据库中存储“一年中的某一天”作为到期日期,但如果年份发生变化,这将不起作用

问题描述

对于我正在创建的东西,用户可以购买可以使用 X 天的物品。该项目的到期日期存储在我的 MySQL 数据库中,我决定将其存储为一个整数,它表示这一年内过去的天数。然后我使用这个值来检查当前过去的天数是否大于到期时间,然后使项目到期。

但是,如果该商品是在 12 月的第 360 天购买的,并且到期日期是 30 天后,即次年的第 25 天,我比较了这两个值 - 该商品将在 360 前到期 > 25.

while (set.next()) {
    String uuid = set.getString("UUID");
    String rank = set.getString("Rank");
    int expiry = set.getInt("Expiry");

    if (DATE < expiry) {
        pipe.hset("donator_data", set.getString("UUID"), set.getString("Rank"));
    } else {
        // expire rank
    }
}

DATE是一年中过去的天数。此代码在服务器启动时运行一次,因此即使它不必太高效,为了安心,我也希望如此。我还考虑过使用日期对象并比较它们,实际上我只需要两个日期,到期(日/月/年)和当前(日/月/年),然后编写一些代码来比较它们(例如 if (expiryYear < year) | | if (expiryMonth < 月) 等

关于如何克服这个问题的任何其他建议?

标签: javadate

解决方案


毫无疑问,最简单的是使用 MySQL 的date数据类型来存储到期日期。

    LocalDate expiration = set.getObject("expiry", LocalDate.class);
    LocalDate today = LocalDate.now(ZoneId.of("Europe/London"));
    if (today.isBefore(expiration)) {
        System.out.println("Fine");
    } else  {
        System.out.println("Expired");
    }

用于将到期日期存储到数据库中:

    LocalDate expiration = LocalDate.now(ZoneId.of("Europe/London")).plusDays(30);
    yourPreparedStatement.setObject(3, expiration);

(假设应将到期日期替换为 SQL 语句中的第三个问号以进行保存)。


推荐阅读