简单日期格式的星期几显示同一天

问题描述

我在以下代码中遇到问题,而不考虑日期,星期四显示为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)接受DateNumber。由于IntegerNumber的子类,因此它按所述方式工作。

众所周知,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 desugaringHow 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);
    }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...