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.time
,modern 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。
我有以下简单代码来根据时区获取星期几。
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.time
,modern 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。