日期范围内的日期范围

2024-03-24

实际上这个任务对我来说似乎很容易,但我有点卡住了,非常感谢一些提示:D

我有一些带有开始和结束时间的事件 - 我想创建一个包含日历周的表格。

因此,我编写了一个方法来检查本周内是否有事件,并将其着色如下:

private boolean inWeek(Date date, Entry pe) {
    return ((pe.getStartsAt().after(Util.firstDayOfWeek(date)) || pe.getStartsAt().equals(Util.firstDayOfWeek(date)))
     && (pe.getEndsAt().before(Util.lastDayOfWeek(date)) || pe.getEndsAt().equals(Util.lastDayOfWeek(date))));
}

如果事件只持续一周,这种情况还可以。但如果事件在本周之前开始,或者在本周之后结束,甚至持续几周呢?

它变得非常复杂,我当前的解决方案是这样的:

private boolean inWeek(Date date, Entry pe) {

    return  (  pe.getStartsAt().after(Util.firstDayOfWeek(date)) &&  pe.getEndsAt().after(Util.firstDayOfWeek(date)) && pe.getEndsAt().before(Util.lastDayOfWeek(date))    ) 
    ||      (  pe.getStartsAt().before(Util.lastDayOfWeek(date)) &&  pe.getStartsAt().after(Util.firstDayOfWeek(date)) &&  pe.getEndsAt().after(Util.lastDayOfWeek(date))  )
    ||      (  pe.getStartsAt().after(Util.firstDayOfWeek(date)) &&  pe.getEndsAt().before(Util.lastDayOfWeek(date))  )
    ||      (  pe.getStartsAt().before(Util.firstDayOfWeek(date)) && pe.getEndsAt().after(Util.lastDayOfWeek(date)) );

}

但在某些细胞中仍然没有显示出正确的颜色。有人对我有任何提示吗?

(...不建议乔达时间^^)


我花了相当多的时间闲逛……好吧,时间……我可以告诉你,我更愿意让别人为我做这项工作。

为此,如果您愿意尝试一下,我会看看JodaTime http://www.joda.org/joda-time/

基本上,这个例子的作用是创建一系列Intervals。一个是“期间”,或一年中的一周(从星期一开始到星期日结束)。

One Interval是一个重叠间隔,跨越“期间”之前一周和之后一周,另一个是单日Interval“期间”内

import org.joda.time.Interval;
import org.joda.time.MutableDateTime;
import org.joda.time.Period;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.DateTimeFormatterBuilder;
import org.joda.time.format.DateTimeParser;

public class TestTimeInterval {

    public static void main(String[] args) {

        DateTimeFormatter formatter = new DateTimeFormatterBuilder().
                        appendDayOfMonth(2).appendLiteral(" ").
                        appendDayOfWeekText().appendLiteral(" ").
                        appendMonthOfYearText().appendLiteral(" ").
                        appendYear(2, 2).
                        toFormatter();

        // Last week
        MutableDateTime targetStart = MutableDateTime.now();
        targetStart.setDayOfWeek(1);
        targetStart.addDays(-6);

        // Next week
        MutableDateTime targetEnd = MutableDateTime.now();
        targetEnd.setDayOfWeek(7);
        targetEnd.addDays(7);

        System.out.println("Target range = " + formatter.print(targetStart) + " to " + formatter.print(targetEnd));
        Interval targetInterval = new Interval(targetStart, targetEnd);

        // This week
        MutableDateTime start = MutableDateTime.now();
        start.setDayOfWeek(1);

        MutableDateTime end = MutableDateTime.now();
        end.setDayOfWeek(7);

        Interval interval = new Interval(start, end);

        System.out.println("Interval range = " + formatter.print(start) + " to " + formatter.print(end));
        System.out.println("Contains interval = " + targetInterval.contains(interval));

        // Last week
        targetStart = DateTime.now();

        // Next week
        targetEnd = DateTime.now();

        System.out.println("Target range = " + formatter.print(targetStart) + " to " + formatter.print(targetEnd));
        targetInterval = new Interval(targetStart, targetEnd);
        System.out.println("Contains interval = " + interval.contains(targetInterval));
    }

}

哪个输出...

Target range = 10 Tuesday December 2013 to 29 Sunday December 2013
Period range = 16 Monday December 2013 to 22 Sunday December 2013
Contains period = true
Target range = 19 Thursday December 2013 to 19 Thursday December 2013
Contains period = true

最终结果只需要通过两种方式检查周期间隔即可。

  1. 检查“期间”是否在提供的范围内Interval and
  2. 如果提供的Interval是在“期限”内...

例如...

 if (period.contains(interval) || interval.contains(period)) {
     // Match...
 }

现在,还有很多其他事情需要考虑,例如,时间是否对Intervals,您需要将时间归零(时间段的开始应该是午夜/早上,结束应该是午夜晚上),这样您就可以最大化捕获区域

更新以更好地利用 JodaTime 库

@BasilBourque 能够突出显示原始示例的一些问题,我已对其进行了相应的更新和测试。谢谢@BasilBourque

虽然与原版类似,但它更好地利用了JodaTime图书馆

public static void newWay() {

    DateTimeFormatter formatter = new DateTimeFormatterBuilder().
            appendDayOfMonth(2).appendLiteral(" ").
            appendDayOfWeekText().appendLiteral(" ").
            appendMonthOfYearText().appendLiteral(" ").
            appendYear(2, 2).
            toFormatter();

    // Last week
    DateTime targetStart = DateTime.now(DateTimeZone.getDefault()).
            withDayOfWeek(DateTimeConstants.MONDAY).
            minusDays(6);
    //MutableDateTime targetStart = MutableDateTime.now();
    //targetStart.setDayOfWeek(1);
    //targetStart.addDays(-6);

    // Next week
    DateTime targetEnd = DateTime.now(DateTimeZone.getDefault()).
            withDayOfWeek(DateTimeConstants.SUNDAY).
            plusDays(7);
    //MutableDateTime targetEnd = MutableDateTime.now();
    //targetEnd.setDayOfWeek(7);
    //targetEnd.addDays(7);

    System.out.println("Target range = " + formatter.print(targetStart) + " to " + formatter.print(targetEnd));
    Interval targetInterval = new Interval(targetStart, targetEnd);

    // This week
    DateTime start = DateTime.now(DateTimeZone.getDefault()).
            withDayOfWeek(DateTimeConstants.MONDAY);
    //MutableDateTime start = MutableDateTime.now();
    //start.setDayOfWeek(1);

    DateTime end = DateTime.now(DateTimeZone.getDefault()).
            withDayOfWeek(DateTimeConstants.SUNDAY);
    //MutableDateTime end = MutableDateTime.now();
    //end.setDayOfWeek(7);

    Interval interval = new Interval(start, end);

    System.out.println("Period range = " + formatter.print(start) + " to " + formatter.print(end));

    System.out.println("Contains period = " + targetInterval.contains(interval));

    // Last week
    targetStart = DateTime.now();

    // Next week
    targetEnd = DateTime.now();

    System.out.println("Target range = " + formatter.print(targetStart) + " to " + formatter.print(targetEnd));
    targetInterval = new Interval(targetStart, targetEnd);
    System.out.println("Contains period = " + interval.contains(targetInterval));

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

日期范围内的日期范围 的相关文章

  • 如何使用java按上次更新时间对SFTP文件进行排序?

    I am having a set of text files in my FTP server 我想阅读今天之前上传的所有文件 其中我必须打印最后三个上传文件的属性 名称 上传时间 大小 现在我将能够打印 FTP 服务器中存在的文件的名称
  • 将 BeanFactory 注入 Bean

    我想注入一个SpringBeanFactory到由同一个创建的 BeanBeanFactory有什么办法可以这样做吗 顺便说一句 我正在开发一个网络应用程序 如果没有 我知道我可以通过以下方式获得 BeanFactoryRequestCon
  • 如何判断lucene索引版本?

    我正在编写一个 shell 脚本 csh 它必须确定 lucene 索引版本 然后根据该版本将索引升级到下一个版本 所以 如果 lucene 索引是 2 x 我必须将索引升级到 3 x 最后索引需要升级到6 x 由于升级索引是一个顺序过程
  • 使用 Ant 运行 JUnit 测试

    我正在尝试运行我的 JUnit 测试用例 但我不断收到错误 Test com capscan accentsWorld FAILED 报告已创建 但测试未运行 这是我的蚂蚁代码
  • 为什么我没有这个类,而它应该在 rt.jar 中?

    所以 我正在尝试在 java 中实现 LDAP 连接 这需要com sun jndi ldap LdapCtxFactory 贾芬德表明LdapCtxFactory应包含在rt jar 据我了解 这是java SDK的基础 Eclipse
  • 切换枚举值:case 表达式必须是常量表达式

    我有一个具有以下结构的枚举 public enum Friends Peter Peter von Reus Engineer Ian Ian de Villiers Developer Sarah Sarah Roos Sandwich
  • Spring Boot 动态重置数据源

    当 Spring 配置文件或自定义数据库属性文件中的数据库名称 密码或主机名等数据库属性发生更改时 我尝试更新 Spring Boot 中的数据源 当属性更改时 应用程序必须通过侦听属性更改来自行更新 一旦数据库配置发生更改 我就使用 Sp
  • Java 中的额外导入会减慢代码加载时间吗?

    向 Java 代码中添加更多 import 语句是否可能会减慢将类加载到 JVM 中所需的时间 不 导入仅在编译中用于查找类引用 添加未使用的导入 它们不会执行任何操作 换一种方式 import java util 只是意味着你可以写 Ma
  • Java 工具创建的 WSDL 文件的 WCF 序列化问题

    我的团队的任务是让几个内部开发的 NET 客户端应用程序连接到一些新的 Java Web 服务 Java Web 服务是第三方 供应商提供的 WSDL 文件 我们的团队修改 控制的能力有限 这意味着我们可能有权要求我们的供应商对 WSDL
  • 以字符集安全的方式获取 Windows 上的进程列表

    这个帖子 https stackoverflow com questions 54686 how to get a list of current open windows process with java给出了一个在 Windows 下
  • 序列化的 lambda 且没有serialVersionUID?

    我正在尝试了解 Java 及其最新版本的序列化如何工作 我正在尝试像这样序列化 lambda Runnable r Runnable Serializable gt System out println This is a test 但我注
  • 异常:java.lang.ClassNotFoundException:运行 Servlet 时的 javax.servlet.http.HttpServletRequest [重复]

    这个问题在这里已经有答案了 我正在编写一个简单的上传 JSP 和 Servlet 教程 概述如下 上传教程 http www java forums org blogs servlet 667 how write servlet uploa
  • TextWatcher.onTextChanged 被多次调用

    我已经阅读了有关此问题的一些主题 但找不到完整的答案 我有一个包含 3 行的 ListView 每行包含一个 TextView 和一个 EditText 以及一个扩展 BaseAdapter 的自定义适配器 这是适配器的 getView 函
  • Java中使用什么方法来销毁你的对象[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 你能为我的问题举一个例子吗 抱歉 J
  • 读取pkcs12证书信息

    我在读取证书信息时遇到问题 我想以编程方式在 Android 中使用 java 和 bouncycastle 库来阅读完整信息 现在 我只是在控制台中使用 keytool 命令 gt keytool list keystore 1 p12
  • ZonedDateTime 的 Jackson 反序列化问题

    我在反序列化我正在使用的服务期间使用的类中有以下字段 private ZonedDateTime transactionDateTime 我正在使用的服务可能会使用以下模式返回日期或日期时间 yyyy MM dd T HH mm ss SS
  • 破译Streamreduce函数

    为什么两者都是c1 and c2不被视为两个字符串 而是一个String和一个Integer Arrays asList duck chicken flamingo pelican stream reduce 0 c1 c2 gt c1 l
  • 如何从 InputStream 读取一行而不缓冲输入? [复制]

    这个问题在这里已经有答案了 我有一个输入流 其中包含一行字符串 然后是二进制数据 如果我使用读取该行new BufferedReader new InputStreamReader inputStream 二进制数据也正在被读取并且不能被重
  • 证明:为什么 java.lang.String.hashCode() 的实现与其文档相符?

    JDK 文档为java lang String hashCode http java sun com javase 6 docs api java lang String html hashCode famously https stack
  • ORA-02289: 序列不存在,hibernbate 中出错

    ORA 02289 序列不存在 hibernbate 中出错 在 Oracle 中 您无法自动生成值 您应该创建一个序列 我们称之为 VEHICLE SEQ 然后你应该把这个注释放在你的 id 上 GeneratedValue strate

随机推荐

  • 使用 JavaScript 设置 HTML 页面垂直位置

    我有一个可以上下滚动的 HTML 页面 不是很多 但确实可以滚动 执行一些 JavaScript 后如何设置页面中的滚动位置 我正在使用 jQuery 在页面底部注入一些额外的 HTML 并且我想在添加新内容后以编程方式滚动到新内容的位置
  • 在 ASP.NET Core 上实现“Fire and Forget”方法的安全方法

    我正在尝试实现一个简单的日志记录库 该库将在多个项目中使用 库的工作是将 HTTP 请求发送到 ElasticSearch 这个库的要点是它不能等待响应 另外 我不关心任何错误 异常 它必须将请求发送到 ElasticSearch 并立即返
  • 我可以使用 CSS 在同一个元素上设置两个背景图像吗?

    HTML 代码示例 table tr td class a b CSS 文件示例 a background image url a png b background image url b png 似乎 b 部分被忽略了 有没有办法将两个图
  • 使用共享包中的 GWT NumberFormat 类

    在我的 GWT 项目中 我的服务返回一个类型的对象Shield我已经定义了 作为Shield客户端和服务器都使用类型 我已将类定义放在共享包中 The Shield类使用com google gwt i18n client NumberFo
  • jquery CSS calc() 函数

    我看到了这个页面CSS链接 http www w3 org TR css3 values calcltexpressiongt我情不自禁地喜欢计算不同单位的结果的想法 不过我尝试过这个 selector css width calc 100
  • Excel::Writer::XLSX 在公式中添加了意外的 @

    我正在使用以下命令将公式写入 xlsx 文件Excel Writer XLSX use Excel Writer XLSX my workbook Excel Writer XLSX gt new test xlsx my workshee
  • 为什么将 NaN 转换为 long 会产生有效结果?

    在下面的示例代码中 我除以零 当我使用调试器单步调试它时 被除数 除数 会产生无穷大或 NaN 如果除数为零 当我将此结果转换为 long 时 我会得到一个有效结果 通常类似于 9223372036854775808 为什么这个演员阵容有效
  • 在电子邮件中设置 tr 或 td 样式?

    我想更改整行单元格的背景颜色和字体大小 和内联样式 因为我不能使用样式表或
  • Xunit 多个 IClassFixtures

    我的问题是如何在一个测试类中设置多个装置 但是Zoo类的构造函数不能处理多个灯具 例如 public class Zoo IClassFixture
  • Symfony2 访问服务中的用户和学说

    我在很多控制器操作中运行与此代码等效的代码 基本上它会获取用户的用户名 如果该用户名附加到博客实体 它将允许用户查看博客实体 em this gt getDoctrine gt getManager user this gt get sec
  • Swift - 具有类型和协议的属性

    在我的 Objective C 类之一中 我有一个 type 属性UIViewController
  • 由于多部分无法加载文件:未找到边界

    我正在尝试从桌面上传图像 但未找到多部分边界的错误 如何设置图片上传的边界 这是我第一次上传图片 请大家多多指教 用户上传图片时的html事件监听器 document getElementById image file addEventLi
  • 通过 openshift 服务器在移动设备上出现 https 安全证书不受信任错误

    我正在 openshift 上启动一个应用程序 我从 namecheap 购买了 comodo Positive ssl 并按照说明在 openshift 上安装 它在桌面浏览器上运行良好 但在 Android 浏览器上出现以下 不可信 错
  • 在 Grails 中,命令“tomcat:deploy”不会像命令“dev war”那样生成完整的战争

    命令 grails dev war 完美部署在我的本地 Tomcat6 服务器中 生成了一个包含以下文件夹的战争 css images js META INF plugins WEB INF 不幸的是 我需要该命令tomcat 部署也有效
  • 如何仅迭代元组的第一个变量

    在Python中 当你有一个元组列表时 你可以迭代它们 例如 当你有 3d 点时 for x y z in points pass do something with x y or z 如果您只想使用第一个变量 或者第一个和第三个变量 该怎
  • case 表达式中是否可以使用不同的数据类型?

    我有这个查询 SELECT CASE WHEN dbo CFE PPHY P77 IS NOT NULL OR dbo CFE PPHY P77 lt gt THEN MONTH dbo CFE PPHY P77 WHEN dbo CFE
  • 直接使用GET和POST有哪些漏洞?

    我想知道有哪些漏洞而直接使用 GET 和 POST 变量 即没有修剪和addslashes函数和mysql转义字符串之类的东西 我的问题是 我们还需要照顾什么在使用 GET 和 POST 时 有哪些类型的攻击比如SQL注入 一般来说 不仅限
  • 将字符串转换为类对象[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我使用将类对象存储到字符串中toSt
  • 如何将一个巨大的文件分割成多个单词?

    如何从文本文件中读取很长的字符串 然后对其进行处理 拆分为单词 我尝试过StreamReader ReadLine 方法 但我得到了OutOfMemory例外 显然 我的队伍非常长 这是我的读取文件的代码 using var streamR
  • 日期范围内的日期范围

    实际上这个任务对我来说似乎很容易 但我有点卡住了 非常感谢一些提示 D 我有一些带有开始和结束时间的事件 我想创建一个包含日历周的表格 因此 我编写了一个方法来检查本周内是否有事件 并将其着色如下 private boolean inWee