想一个场景,有一个游戏按一周一个赛季,需要记录下玩家每个赛季的积分排名、连胜排名
赛季需要一个唯一标识 (标识 = 年 + 当年的第几周)
这样会出现一个问题,每年的最后一周是属于这一年的还是属于下一年的,
我们需要确定这样周跨年的情况属于哪一年,确保这一周只被计算了一次(而不是跨年的周当成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第一周,没有被重复计算
转载请注明:汪明鑫的个人博客 » 如何处理最后一周跨年
说点什么
您将是第一位评论人!