SimpleDateFormat("EEEE") Returns 错误的时区星期几

SimpleDateFormat("EEEE") Returns Wrong Day of Week for Timezone

我有以下简单代码来根据时区获取星期几。

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(details.getTimezone()));
String dayOfWeek = new SimpleDateFormat("EEEE").format(calendar.get(Calendar.DAY_OF_WEEK));

此处,details.getTimezone() return 是可接受的值,例如“Asia/Kolkata”,calendar.get(Calendar.DAY_OF_WEEK) return 是正确的值 6。

按照顺序,第 6 天应该 return “星期五”,但是这个函数 returns “星期四” 代替。

如果我做错了什么,请告诉我。

另外请告诉我我对 DAY_OF_WEEK = 6 表示星期五的理解是否正确。

java.time

java.util 日期时间 API 及其格式 API、SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*.

解决方案使用java.time,现代API:

import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Asia/Kolkata"));
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEEE", Locale.ENGLISH);
        System.out.println(dtf.format(zdt));
    }
}

输出:

Friday

详细了解 java.timemodern Date-Time API* 来自 Trail:日期时间.

使用旧版 API:

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) {
        Date date = new Date();
        DateFormat sdf = new SimpleDateFormat("EEEE", Locale.ENGLISH);
        sdf.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
        System.out.println(sdf.format(date));
    }
}

输出:

Friday

* 无论出于何种原因,如果您必须坚持Java 6 或Java 7,您可以使用ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and

SimpleDateFormat s = new SimpleDateFormat("EEEE");

Date  date= new Date();

String dayOfTheWeek = s.format(date);

使用此代码获取周五结果

你的代码出了什么问题?

Java 1.0 和 1.1 中的旧日期和时间 类 设计糟糕且令人困惑,并且早已过时。

Please let me know if I am doing anything wrong.

你做错的主要是你用错了类。使用 java.time,现代 Java 日期和时间 API,如 Arvind Kumar Avinash 在答案的前半部分所述。

关于 SimpleDateFormat 的一个令人困惑的事情是它接受将自纪元(UTC 中一天开始时的 1970-01-01)以来的毫秒数格式化为日期。你是对的 calendar.get(Calendar.DAY_OF_WEEK) returns 6 今天,你是正确的,这应该是星期五。 Calendar 从星期日 = 1 开始计算星期几。当您将 6 传递给 SimpleDateFormat.format() 时,它将 6 解释为 1970 年 1 月 1 日 UTC 午夜后 6 毫秒。1970 年 1 月 1 日是星期四(UTC 午夜过后 6 毫秒在地球的西半部仍然只是星期三)。因为在您的时区也是星期四,所以这是您得到的星期几。

所以可能要重复一遍,不要使用那些旧的 类。使用 java.time。它使用起来非常好,并且更难犯类似错误。

Link

Oracle tutorial: Date Time 解释如何使用 java.time。