Java SimpleDataFormat(“EEEE”)为时区返回错误的星期几

Java SimpleDataFormat(“EEEE”)为时区返回错误的星期几,java,calendar,simpledateformat,dayofweek,Java,Calendar,Simpledateformat,Dayofweek,我有以下简单的代码来根据时区获取一周中的某一天 Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(details.getTimezone())); String dayOfWeek = new SimpleDateFormat("EEEE").format(calendar.get(Calendar.DAY_OF_WEEK)); 这里,details.getTimezone返回一个可接受的值,如Asi

我有以下简单的代码来根据时区获取一周中的某一天

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(details.getTimezone()));
String dayOfWeek = new SimpleDateFormat("EEEE").format(calendar.get(Calendar.DAY_OF_WEEK));
这里,details.getTimezone返回一个可接受的值,如Asia/Kolkata,calendar.getCalendar.DAY\u OF_WEEK返回正确的值6

根据顺序,第6天应返回星期五,但此函数将返回星期四

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

另外,请告诉我,我是否正确理解了“星期六”表示星期五。

java.time java.util日期时间API及其格式化API SimpleDataFormat已经过时,并且容易出错。建议完全停止使用,并切换到*

使用java.time(现代API)的解决方案:

输出:

了解更多关于java.time的信息,从

使用传统API:

输出:

*无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7。如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认。

使用此代码获取星期五结果

代码中出现了什么错误? Java1.0和1.1中的旧日期和时间类设计糟糕、令人困惑,而且早已过时

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

你做错的主要事情是你使用了错误的类。使用java.time,现代java日期和时间API,正如Arvind Kumar Avinash在回答的前半部分所解释的

SimpleDataFormat有一个令人困惑的地方,那就是它接受UTC中从1970-01-01纪元开始的毫秒数格式作为日期。你是对的,calendar.getCalendar.DAY\u OF_WEEK今天返回6,你是对的,这应该是指星期五。日历编号从星期日开始的一周中的天数=1。将6传递给SimpleDataFormat.format时,它将6解释为1970年1月1日UTC午夜后6毫秒。1970年1月1日是UTC午夜6毫秒后的一个星期四,但在地球的西半部,它仍然只是星期三。因为这也是你所在时区的星期四,所以这是你每周的一天

所以我可能会重复我的话,不要使用那些旧类。使用java.time。使用它更好,而且犯类似的错误也更难

链接
解释如何使用java.time。

我建议您不要使用Calendar和SimpleDataFormat。这些类设计得很糟糕,而且早已过时,后者尤其是出了名的麻烦。相反,请使用LocalDate和DateTimeFormatter,这两种格式都来自。两个错误:a在SimpleDateFormat实例上也设置时区。b您不能使用此实例格式化整数calendar.getDAY\u OF_WEEK。相反,您必须格式化java.util.Date类型的对象,例如calendar.getTime.Um Entschuldigung,@MenoHochschild,这一次我不同意您所写的内容。SimpleDataFormat显然可以格式化一个整数,只是不能得到预期的结果。不应该使用java.util.Date,也不应该使用SimpleDateFormat、日历或时区。@OleV.V。从技术上讲,可以毫无例外地对整数使用SimpleDataFormat,但是结果是错误的,每个设计都没有类型安全性。这个旧的格式化程序只设计用于与java.util.Date-sic的组合,甚至不用于java.util.Calendar。很抱歉,如果我在之前的评论中没有充分说明这一点。当然,这些旧库设计得不好,应该避免使用。只是我的评论提到了OP的内容,他想知道他在使用旧库时出了什么问题。他不知道过时的SimpleDateFormat。非常感谢。
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
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
SimpleDateFormat s = new SimpleDateFormat("EEEE");

Date  date= new Date();

String dayOfTheWeek = s.format(date);