Welcome everyone

如何处理最后一周跨年

java 汪明鑫 26浏览 0评论

想一个场景,有一个游戏按一周一个赛季,需要记录下玩家每个赛季的积分排名、连胜排名

赛季需要一个唯一标识 (标识 = 年 + 当年的第几周)

这样会出现一个问题,每年的最后一周是属于这一年的还是属于下一年的,

我们需要确定这样周跨年的情况属于哪一年,确保这一周只被计算了一次(而不是跨年的周当成2个赛季来处理)

 

 

joda-time 就提供了这样的功能

我们首先引入他的maven依赖

<!-- https://mvnrepository.com/artifact/joda-time/joda-time -->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.9.9</version>
        </dependency>

 

public class GameUtils {
    private static final int MULTI_HUNDRED = 100;

    //获取当前赛季
    public static long getCurrentRoundId() {
        DateTime now = DateTime.now();
        return generateRoundId(now);
    }

    //获取上一赛季
    public static long getLastRoundId() {
        DateTime now = DateTime.now();
        DateTime lastWeek = now.minusWeeks(1);
        return generateRoundId(lastWeek);
    }

    //获取当前赛季唯一标识(年+当年的第几个星期)
    //如果出现本年最后一周跨年的,跨年的周只会计算一次不会重复计算
    private static long generateRoundId(DateTime nowTime) {
        int weekYear = nowTime.getWeekyear();
        int weekOfWeekYear = nowTime.getWeekOfWeekyear();
        return weekYear * MULTI_HUNDRED + weekOfWeekYear;
    }
}

关键API  DateTime

getWeekyear()  getWeekOfWeekyear()

 

 

这样一个生成赛季标识id的工具类已经ok了

我们在来写一些demo和看下日历check下

我们就挑2019年的最后一天和2020的第一天来验证

 

 

2019.12.31 是周二

2020.1.1  是周三

 

 

package pers.wmx.springbootfreemarkerdemo;

import org.joda.time.DateTime;

/**
 * @author: wangmingxin03
 * @date: 2020-05-19
 */
public class TimeTest {

    public static void main(String[] args) {
        DateTime dateTime1 = new DateTime(
                2019, //year
                12,    // month
                31,    // day
                1,    // hour (midnight is zero)
                0,    // minute
                0,    // second
                0     // milliseconds
        );
        System.out.println("2019.12.31");
        System.out.println(dateTime1.getWeekyear());
        System.out.println(dateTime1.getWeekOfWeekyear());

        DateTime dateTime2 = new DateTime(
                2020, //year
                1,    // month
                1,    // day
                1,    // hour (midnight is zero)
                0,    // minute
                0,    // second
                0     // milliseconds
        );
        System.out.println("2020.1.1");
        System.out.println(dateTime1.getWeekyear());
        System.out.println(dateTime1.getWeekOfWeekyear());

        DateTime lastWeek = dateTime1.minusWeeks(1);
        System.out.println("2019.12.31的上一周");
        System.out.println(lastWeek.getWeekyear());
        System.out.println(lastWeek.getWeekOfWeekyear());

    }
}

 

运行代码输出如下:

2019.12.31
2020
1
2020.1.1
2020
1
2019.12.31的上一周
2019
52

 

2019.12.31 是周二 ,2020.1.1  是周三,2个的getWeekyear()  getWeekOfWeekyear() 是一样的,

都属于2020第一周,没有被重复计算

 

 

 

 

转载请注明:汪明鑫的个人博客 » 如何处理最后一周跨年

喜欢 (0)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz