【问题标题】:Why does new java.text.SimpleDateFormat("EEEE").format(new java.util.Date(2015, 6, 9)) return the wrong day of the week?为什么 new java.text.SimpleDateFormat("EEEE").format(new java.util.Date(2015, 6, 9)) 返回错误的星期几?
【发布时间】:2015-06-09 14:38:43
【问题描述】:

我想从date 中的Java 中获取星期几。为什么这会返回Friday when,实际上是Tuesday

new java.text.SimpleDateFormat("EEEE").format(new java.util.Date(2015, 6, 9))

PS 我知道java.util.Date(int year, int month, int day) 已被弃用,也许这与它有关。

【问题讨论】:

  • 我想我很着迷,为什么你遇到这个问题的第一个倾向是在 stackoverflow 上发帖,而不是去 java.util.Date javadocs 并阅读构造函数文档。您需要知道的一切都在那里。
  • 相关:Date from EditText.

标签: java date simpledateformat


【解决方案1】:

该已弃用的构造函数中的 month 参数在 1 月份从 0 开始,因此如果您谈论的是 6 月 9 日,您可能想要 new Date(115, 5, 9)115 是因为 year 参数是“因为1900")。

来自the documentation

参数:

year - 减去 1900 的年份。

month - 0-11 之间的月份

date - 1-31 之间的一个月中的某一天。

(我的重点。)

您曾说过您想以单行方式来做这件事。在 Java 8 中,您可以这样做:

String day = LocalDate.of(2015, 6, 9).format(DateTimeFormatter.ofPattern("EEEE"));

使用java.time.LocalDatejava.time.format.DateTimeFormatter

【讨论】:

  • @BrianTHann class java.util.Date 不幸设计得很糟糕。
  • @BrianTHannan 如果您使用的是 Java 8,请忘记 java.util.Date 并改用 java.time 包中的新 API。否则,使用 java.util.Calendar 代替已弃用的构造函数。
  • 尽可能避免使用java.util.Date
  • @Peanut 我会说,对于 1990 年代设计的课程来说,减去 1900 年这一事实是一个更严重的设计错误(两位数的年份??那时每个人都知道 Y2K 问题!)。
  • @BrianTHannan:但是如果你听从 Jesper 的建议(他通常不会误导你)并使用java.time,我认为我刚刚添加到答案中的单行就可以了。
【解决方案2】:

java.time

旧的日期时间 API(java.util 日期时间类型及其格式化 API,SimpleDateFormat)已过时且容易出错。建议完全停止使用,改用java.timemodern date-time API*

使用现代日期时间 API 的解决方案:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        System.out.println(DateTimeFormatter.ofPattern("EEEE", Locale.ENGLISH).format(LocalDate.of(2015, 6, 9)));

        // Alternatively
        System.out.println(LocalDate.of(2015, 6, 9).getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.ENGLISH));
    }
}

输出:

Tuesday
Tuesday

通过 Trail: Date Time 了解有关 modern date-time API* 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

【讨论】:

    猜你喜欢
    • 2021-08-16
    • 2019-07-12
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多