当前位置: 首页 > 知识库问答 >
问题:

Java“周年”到底是如何工作的?

钱安和
2023-03-14

这是一个简单的错误:我在SimpleDateFormat对象的格式字符串中使用了yyy而不是yyy。但我完全困惑于我的测试结果与错误的格式字符串。

以下代码:

@Test
public void whatTheHell() {
        try {
                SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/YYYY");

                Date d1 = sdf.parse("01/07/2016");
                Date d2 = sdf.parse("02/08/2016");
                Date d3 = sdf.parse("11/29/2027");

                System.out.println(d1.toString());
                System.out.println(d2.toString());
                System.out.println(d3.toString());
        } catch (ParseException pe) {
                fail("ParseException: " + pe.getMessage());
        }
}
Sun Dec 27 00:00:00 PST 2015
Sun Dec 27 00:00:00 PST 2015
Sun Dec 27 00:00:00 PST 2026

@Jan建议依赖toString()方法可能会有问题,所以我定义了一个日期格式,以与上面相同的代码打印yyyy MM dd'-'yyyy MM dd。下面是附加输出:

2016 12 27 - 2015 12 27
2016 12 27 - 2015 12 27
2027 12 27 - 2026 12 27

共有1个答案

张玺
2023-03-14

一周可以用不同的方式定义。例如,在美国,一周的第一天通常被认为是星期天,而在欧洲和许多其他地方,第一天是星期一。

同样,以周为基础的一年中的一周也可以用不同的方式定义。

  • 第1周包含1月1日。
  • 周#1是包含一周中特定一天(如星期日)的第一周。
  • 第1周是仅包含新年天数的第一周,没有前一年的日期。
  • …及更多
    null

我建议尽可能使用ISO 8601标准定义。这个标准定义简单而合乎逻辑,越来越多的行业采用这种定义。

WeekFields类中,java.time类为基于周的年份提供了一些支持。

LocalDate ld = LocalDate.of( 2019 , Month.JANUARY , 1 ) ;
long week = ld.get( WeekFields.ISO.weekOfWeekBasedYear() ) ;

请查看在ideone.com实时运行的代码。

LocalDate ld = LocalDate.of ( 2019 , Month.JANUARY , 1 );
YearWeek yw = YearWeek.from ( ld );
LocalDate startOfWeek = yw.atDay ( DayOfWeek.MONDAY );

YW.ToString():2019-W01

StartOfWeek.toString():2018-12-31

请注意,在以周为基础的2019年中,一年的第一天是如何从上一个日历年(2018年)而不是2019年开始的。

  • Java SE 8、Java SE 9、Java SE 10、Java SE 11和更高版本--标准Java API的一部分,带有绑定的实现。
  • Java9添加了一些小特性和修正。
  • Java SE 6和Java SE 7
  • 大部分Java.time功能在threeten-backport中回移植到Java6和7。
  • Android
  • java.time类的Android bundle实现的更新版本。
  • 对于早期的Android(<26),ThreeTenABP项目适应了ThreeTen-Backport(上面提到)。查看如何使用threetenabp….
 类似资料:
  • 问题内容: 注释如何工作? 如果我有这样的事情: 将如何影响testNumber?它甚至会影响testNumber吗? 谢谢。让我知道我是否使用错了。 问题答案: 不会影响电话号码。它仅用于制作javadocs。 有关Javadoc的更多信息:http : //www.oracle.com/technetwork/java/javase/documentation/index-137868.htm

  • 我们知道主存域很少:年轻的、终生的(旧的gen)和PermGen。 年轻领域分为伊甸园和幸存者(有两个)。 OldGen用于生存的对象。 MaxTenuringThreshold防止对象过早地被最终复制到OldGen空间。这很清楚,也很容易理解。 但是它是如何工作的呢?垃圾回收器如何处理这些在MaxTenuringThreshold之前仍然存在的对象,以何种方式?它们位于何处? 对象被复制回幸存者

  • 我正在学习Spring核心认证,我对Spring如何处理bean生命周期有一些疑问,特别是bean后处理器。 所以我有了这个模式: 我很清楚这意味着什么: 然后在bean创建阶段执行以下步骤: > 每个bean都在缺省情况下被急切地实例化(按照正确的顺序创建,并注入其依赖项)。 在依赖注入之后,每个bean都会经历一个后处理阶段,在这个阶段中可能会进行进一步的配置和初始化。 > 初始化器:如果指示

  • 我几乎理解了尾递归是如何工作的,以及它与普通递归之间的区别。我只是不明白为什么它不要求堆栈记住它的返回地址。 在尾递归函数中调用函数本身后没有什么可做的,但对我来说这没有意义。

  • 当我创建一个api并使用laravel资源时,是更好地获取完整的数据,然后选择在资源文件中发送哪些列,还是从数据库中选择数据时,确定应该选择哪些列? 1)

  • 根据Javadoc关于字符串。实习生(): 调用intern方法时,如果池中已经包含一个由equals(Object)方法确定的等于此String对象的字符串,则返回池中的字符串。否则,将此String对象添加到池中并返回对此String对象的引用。 我对此没有什么问题。 当创建一个新的字符串对象(不是使用字符串文字,而是使用new()操作符)时,如: