如何解决简单日期格式的星期几显示同一天
我在以下代码中遇到问题,而不考虑日期,星期四显示为dayOfTheWeek。有什么想法让我错了吗?
public void CreatePlan() {
editPlanName = findViewById(R.id.editPlanName);
String plan_name = editPlanName.getText().toString();
DatabaseManager db;
int day = datepicker.getDayOfMonth();
int month = datepicker.getMonth();
int year = datepicker.getYear();
SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
Integer d_name = day;
Integer plan_recipe = 0;
Log.d("Date",String.valueOf(d_name));
String dayOfTheWeek = sdf.format(d_name);
String date = day + "/" + month + "/" +year;
db = new DatabaseManager(getApplicationContext());
Log.d("Recipe name",recipe_name);
db.createPlanRecipe(d_name,date,dayOfTheWeek,recipe_name);
db.createPlan(plan_name,plan_recipe);
}
解决方法
您必须从Date
创建datepicker
,然后将其格式化为如下所示的日期:
int day = datePicker.getDayOfMonth();
int month = datePicker.getMonth();
int year = datePicker.getYear();
Calendar calendar = Calendar.getInstance();
calendar.set(year,month - 1,day);
SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
dayOfTheWeek = sdf.format(calendar.getTime());
,
…有什么想法让我错了吗?
day
是程序中的每月的1到31。因此,d_name
也保留此数字。
您的SimpleDateFormat
接受将数字格式化为日期和时间,以UTC时间为1970年1月1日00:00开始的毫秒数。因此,它将始终在纪元后的前31毫秒内格式化日期和时间。根据您所在的时区,您格式化的时间点是在1969年12月31日星期三或1970年1月1日星期四。因此,您将始终是星期三或始终是星期四。
SimpleDateFormat.format(Object)
接受Date
或Number
。由于Integer
是Number
的子类,因此它按所述方式工作。
众所周知,SimpleDateFormat
类很麻烦,您只看到了人们经常遇到的问题的一小部分。另一个答案中使用的Calendar
类的设计也很差。两者都已经过时了。建议您改用java.time,the modern Java date and time API。
进一步链接:My answer to another question about getting the day of week from an Android date picker。
,在下面的代码行中,您将获取当月,月份和年份的值,但是您没有将这些值设置到应该为您提供的Calendar
对象中通过处理这些值的其他信息(例如星期几):
int day = datepicker.getDayOfMonth();
int month = datepicker.getMonth();
int year = datepicker.getYear();
因此,在尝试从Calendar
对象获取任何其他信息之前,请将这些值设置为该对象,如下所示:
// Set the picked values into an instance of Calendar
Calendar calendar = Calendar.getInstance();
calendar.clear();// Make sure to call this to reset all fields
calendar.set(year,day);// Make sure to decrease month by 1
现在,您的其余代码将按预期运行,例如假设您选择4
作为月份,10
作为月份,选择2020
作为年份,以下代码将为您提供Sunday
作为星期几。
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class Main {
public static void main(String[] args) {
int day = 4;
int month = 10;
int year = 2020;
// Set the picked values into an instance of Calendar
Calendar calendar = Calendar.getInstance();
calendar.clear();// Make sure to call this to reset all fields
calendar.set(year,day);// Make sure to decrease month by 1
System.out.println(calendar.getTime());
// Your desired format
SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
// The day-of-the-week for the specified date
String dayOfTheWeek = sdf.format(calendar.getTime());
System.out.println(dayOfTheWeek);
}
}
输出:
Sun Oct 04 00:00:00 BST 2020
Sunday
请注意,我将月份(从日期选择器中选择)减少了1
,因为java.util
日期时间API基于0
作为{{1}的月份}。
一条建议:
我建议您从过时且容易出错的January
日期时间API和java.util
切换到modern SimpleDateFormat
日期时间API和相应的格式化API (来自软件包java.time
)。从 Trail: Date Time 了解有关现代日期时间API的更多信息。
如果您的Android API级别仍不符合Java-8,请选中Java 8+ APIs available through desugaring和How to use ThreeTenABP in Android Project。
使用现代的日期时间API:
java.time.format
输出:
import java.time.LocalDate;
import java.time.format.TextStyle;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
int dayOfMonth = 4;
int month = 10;
int year = 2020;
// Instantiate a LocalDate object using the picked values
LocalDate date = LocalDate.of(year,month,dayOfMonth);
// The day-of-the-week for the specified date
String dayOfTheWeek = date.getDayOfWeek().getDisplayName(TextStyle.FULL,Locale.ENGLISH);
System.out.println(dayOfTheWeek);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。