日历日添加无法正常工作

如何解决日历日添加无法正常工作

我正在尝试编写一种算法,该算法基于1到31(一个月中的一天)之间的数字,它将返回该日期/数字之前时刻的毫秒数。 该算法将始终使用今天的日期。

示例: 输入5 输出:1601845199000,即2020年10月4日23:59:59

================

输入:31 输出:1601499599000,这是2020年9月30日在23:59:59

因为月份没有31天,即使指定了31天,算法也会采用最接近的日期。

2月29日(29/30)也是如此

    val calendar = Calendar.getInstance()        
    calendar.set(Calendar.HOUR_OF_DAY,23)
    calendar.set(Calendar.MINUTE,59)
    calendar.set(Calendar.SECOND,59)
    calendar.clear(Calendar.MILLISECOND)

    val lastDayNumber = 31

    var found = false
    while (!found) {
        if (calendar.get(Calendar.DAY_OF_MONTH) <= lastDayNumber) {
            found = true
        }

        if (calendar.get(Calendar.DAY_OF_MONTH) < lastDayNumber) {
            calendar.add(Calendar.DATE,1)
        }
    }

问题是calendar.add(Calendar.DATE,1)根本无法工作。

此方法应找到将来给出的数字的前一天。我想念什么吗?我已经阅读了文档和其他StackOverflow答案,但仍然无法理解。

Edit1:我也尝试过calendar.add(Calendar.DAY_OF_MONTH,1)和+1,但是-1工作得很好。

Edit2:

看着GregorianCalendar.java,我看到以下内容:

        // Handle week,day and AM_PM fields which involves
        // time zone offset change adjustment. Convert the
        // given amount to the number of days.
        case WEEK_OF_YEAR:
        case WEEK_OF_MONTH:
        case DAY_OF_WEEK_IN_MONTH:
            delta *= 7;
            break;

        case DAY_OF_MONTH: // synonym of DATE
        case DAY_OF_YEAR:
        case DAY_OF_WEEK:
            break;

如果我以WEEL_OF_YEAR为例,则相同的代码还将在week_of_month和day_of_week_in_month运行,因为不间断,所有3个字段都通过相同的代码运行。

但是,我发现绝对没有代码可以在DAY_OF_MONTHDAY_OF_YEARDAY_OF_WEEK上运行。

P.S。我找不到DATE字段

================================================ ===

使用LocalDateTime

fun getLastDayOfMonth(date: LocalDateTime): Long {
    val lastDayNumber = lastDay?.filter { it.isDigit() }!!.toInt()

    var found = false
    while (!found) {
        if (date.dayOfMonth <= lastDayNumber) {
            found = true
        } else {
            date.plusDays(1)
        }
    }

    return date.toEpochSecond(ZoneOffset.UTC)
}

date.plusDays(1) is not changing the date variable to be next day ...

解决方法

您可以使用java.time,它为此提供了非常方便的方法。

请参见以下示例:

import java.time.LocalDate

fun main() {
    val fourDaysAgo = findDate(4)
    println(fourDaysAgo)
}

fun findDate(daysAgo: Long): LocalDate {
    return LocalDate.now().minusDays(daysAgo)
}

它输出4天前的日期(今天/ 2020-09-07执行)

2020-09-03

LocalDate.now()计算今天的日期(注意:仅是日期部分,不涉及一天中的时间,偏移量或时区),并返回具有方法LocalDate的{​​{1}}如有必要,可以通过调整月份和年份来正确计算之前的日期

如果您执行以下操作:

minusDays(long days)

输出为

println(LocalDate.of(2020,1,1).minusDays(1))

如果您还需要时间部分,甚至可能需要偏移量或时区来真正正确地减去天,小时,分钟或任何时间单位,请查看2019-12-31 中的其他类。

在您的问题下的以下评论之后,

编辑:
如果输入7,今天是9月7日,则应该是10月6日。如果输入8,则应该是9月7日(今天)

java.time

注意:我猜想输入月份少于今天的情况是因为您没有为它指定任何行为。该案件的处理方式与每月(争论和今天)的天数相同。

,

这是我的去。像deHaar一样,我强烈建议您使用java.time(现代的Java日期和时间API)进行日期和时间工作。您尝试使用的Calendar类的设计很差,而且已经过时。

由于您希望将时间设为午夜前1秒钟,因此我们首先声明一个具有以下值的常量:

private static final Duration timeBeforeStartOfDay = Duration.ofSeconds(1); 

如果您希望有一天,可以很容易地将其更改为1分钟,1毫秒或1纳秒。

我们需要考虑一些极端情况。我认为这段代码可以做到:

    ZoneId zone = ZoneId.systemDefault();
    int dayNumber = 31;
    
    LocalDate today = LocalDate.now(zone);

    YearMonth ym = YearMonth.from(today);
    if (dayNumber <= today.getDayOfMonth()) {
        // Next month
        ym = ym.plusMonths(1);
    }
    ZonedDateTime targetDateTime;
    if (dayNumber > ym.lengthOfMonth()) {
        // Use end of month
        targetDateTime = ym.plusMonths(1)
                .atDay(1)
                .atStartOfDay(zone)
                .minus(timeBeforeStartOfDay);
    } else {
        // Use day number
        targetDateTime = ym.atDay(dayNumber)
                .atStartOfDay(zone)
                .minus(timeBeforeStartOfDay);
    }
    long milliseconds = targetDateTime.toInstant().toEpochMilli();
    
    System.out.println("Target date and time: " + targetDateTime);
    System.out.println("Target milliseconds: " + milliseconds);

我们在哪个时区运行它会有所不同。我在欧洲/布加勒斯特时区运行过它,因为我想它可能是您的。今天(9月7日)的输出为:

Target date and time: 2020-09-30T23:59:59+03:00[Europe/Bucharest]
Target milliseconds: 1601499599000

链接: Oracle tutorial: Date Time解释了如何使用java.time。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;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,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;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[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 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 -&gt; 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(&quot;/hires&quot;) 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&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-