我有ISO 8601种格式的周数据.例如:

weekA = '2012-W48'
weekB = '2013-W03'

Java中是否有一个类可以表示这几周并支持基本的时态操作?我try 了LocalDate.parse("2012-W48",DateTimeFormatter.ISO_WEEK_DATE);,但这抛出了一个错误,因为这是一个星期,而不是一个实际的日期(即一周中的某一天丢失了).与LocalDate类类似,我希望能够执行一些基本的时态操作,例如:

  • 如果weekAweekB之前,则weekA.isBefore(weekB)返回true
  • weeksBetween(weekA,weekB)返回两周日期之间的周数,即weekB-weekA周.

理想情况下,我只使用标准Java类(Java>=11).

推荐答案

Using standard library

最初的解决方案(如下所示)使用的是外部库.这一解决方案的功劳是 user85421分.我们的 idea 是将给定的字符串解析为LocalDate,方法是将星期几设为缺省日期-1.

public class Main {
    public static void main(String[] args) {
        String strWeekA = "2012-W48";
        String strWeekB = "2013-W03";

        DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                .appendPattern("YYYY-'W'ww")
                .parseDefaulting(ChronoField.DAY_OF_WEEK, 1)
                .toFormatter();

        LocalDate date1 = LocalDate.parse(strWeekA, dtf);
        LocalDate date2 = LocalDate.parse(strWeekB, dtf);

        System.out.println(WEEKS.between(date1, date2));
    }
}

Output:

7

100

Using an external library (original solution)

您可以使用ThreeTen-Extra库来满足您的需求.

您可以使用YearWeek及其isBeforeisAfter方法.

您可以使用java.time.temporal.ChronoUnit#between来计算两个YearWeek对象之间的时间量.或者,您可以使用YearWeek#until来获得相同的结果.

下面给出了它的Maven依赖项:

<dependency>
  <groupId>org.threeten</groupId>
  <artifactId>threeten-extra</artifactId>
  <version>1.7.2</version>
</dependency>

Demo:

import org.threeten.extra.YearWeek;
import static java.time.temporal.ChronoUnit.WEEKS;

public class Main {
    public static void main(String[] args) {
        String strWeekA = "2012-W48";
        String strWeekB = "2013-W03";
        YearWeek weekA = YearWeek.parse(strWeekA);
        YearWeek weekB = YearWeek.parse(strWeekB);
        System.out.println(weekA.isBefore(weekB));
        System.out.println(WEEKS.between(weekA, weekB));
        System.out.println(weekA.until(weekB, WEEKS));
    }
}

Output:

true
7
7

Java相关问答推荐

Java中不同包中的类之间的配置共享

R.id.main给我一个红色错误,无法解析MainActivity.java中的符号main

调用引发泛型异常的泛型方法时出现编译错误

FALSE:它应该在什么时候使用?

如何创建同一类的另一个对象,该对象位于变量中?

第二次按下按钮后,我需要将按钮恢复到其原始状态,以便它可以再次工作

Com.google.firebase.database.DatabaseException:无法将类型为java.lang.Boolean的值转换为字符串.这是关于什么的?

使用UTC时区将startDatetime转换为本地时间

在Java 17中使用两个十进制数字分析时间时出错,但在Java 8中成功

如何在EXCEL单元格中添加形状和文本

Spring Security不允许加载js

Spring Boot&;Docker:无法执行目标org.springframework.boot:spring-boot-maven-plugin:3.2.0:build-image

与IntArray相比,ArrayList<;Int>;对于大量元素的性能极差

Java.lang.invke.LambdaConversionException:实例方法InvokeVirtual的参数数量不正确

组合连接以从两个表返回数据

处理4.3问题:javax.xml.ind包不存在(&Q;).您可能在学习GitHub教程时遗漏了库.&Q

如何将RESTAssured';S的Http标题转换为<;字符串、字符串和>的映射?

使用同步方法中的新线程调用同步方法

org.springframework.web.HttpRequestMethodNotSupportedException:请求方法';帖子';不支持

保持标题窗格的箭头可见,即使设置为不可折叠