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

如何解决简单日期格式的星期几显示同一天

我在以下代码中遇到问题,而不考虑日期,星期四显示为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);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-