使用 p:calendar 相互限制开始和结束日期时间(无验证)

2024-01-02

我们需要向用户呈现两个 p:calendar 组件,分别代表开始日期和结束日期。两个日期时间都有日期、小时和分钟。 PrimeFaces 拥有完美mindate, maxdate, minHour, maxHour, minMinute, and minMinute可用属性。

现在的要求是:

不可能将开始日期时间设置为大于或等于结束日期时间。 不可能将结束日期时间设置为小于或等于结束日期时间。

以下等式应该成立:

begin datetime < end datetime

现在我们尝试了以下 JSF:

<p:calendar id="begin-date"
            value="#{debugManager.selectedBeginDate}"
            mindate="#{debugManager.minBeginDate}"
            maxdate="#{debugManager.maxBeginDate}"
            maxHour="#{debugManager.maxBeginHour}"
            maxMinute="#{debugManager.maxBeginMinute}"
            pattern="yyyy-MM-dd HH:mm"
            showButtonPanel="true"
            readonlyInput="true"
            navigator="true"
            showOn="button"
            required="true">
    <p:ajax event="dateSelect" update="end-date" />
</p:calendar>

<p:calendar id="end-date"
            value="#{debugManager.selectedEndDate}"
            mindate="#{debugManager.minEndDate}"
            minHour="#{debugManager.minEndHour}"
            minMinute="#{debugManager.minEndMinute}"
            pattern="yyyy-MM-dd HH:mm"
            showButtonPanel="true"
            readonlyInput="true"
            navigator="true"
            showOn="button">
    <p:ajax event="dateSelect" update="begin-date" />
</p:calendar>

这是一个示例性最小/最大方法(结束日期的中间日期):

public Date getMinEndDate()
{
    return this.getSelectedBeginDate();
}

正如您所看到的,最短结束日期是当前 AJAX 选择的开始日期。正确设置结束日期不允许将开始日期设置为超过结束日期。

当将时间纳入方程式时,问题就开始了......

由于 p:calendar 的接口具有单独的方法,因此 bean 必须提供逻辑:

public int getMinEndHour()
{
    Date selectedBeginDate = this.getSelectedBeginDate();
    Date selectedEndDate = this.getSelectedEndDate();

    if ( selectedBeginDate != null && DateUtil.isSameDay( selectedBeginDate, selectedEndDate ) )
    {
        return DateUtil.getHourOf( selectedBeginDate );
    }

    return ComplianceConstants.DEFAULT_COMPLIANCE_CASE_MIN_END_HOUR;
}

这基本上只是说如果已经设置了开始日期并且开始日期和结束日期当前相同,则限制可选择的结束时间(minHour结束日期)到开始时间。

运营:

Set the begin datetime to 2013-04-20 12:34 (legit)
Set the end   datetime to 2013-04-22 00:00 (legit)

现在,结束日期的时间为 00:00,并且只要将结束时间以某种方式调整为至少 12:35,就应该允许选择日历日期 2013-04-20。

然而 p:calendar 组件现在无法知道这一点

sets the end datetime to 2013-04-20 00:00 (legit, but false)

...

现在的问题是,当用户按下日历中某个新的结束日期时,mindate/maxdate 属性无法限制用户点击与开始日期相同的日期。如果结束日期time现在恰好是在相同的开始日期时间我们对此无能为力(这是错误的)。

现在的后续问题是用户可以关闭日历并只需按提交按钮即可将虚假数据插入数据库。当然,可以/应该运行验证器,但是我们必须以某种方式在没有验证器的情况下实现这一目标.

我们接下来尝试的是修补setSelectedBeginDate( Date selectedBeginDate ) and setSelectedEndDate( Date selectedEndDate )调整设定的方法java.util.Date如果日期在同一天,则时间部分。像这样的事情:

public void adjustSelectedEndDate()
{
    if ( this.selectedEndDate != null )
    {
        this.log.infov( "adjustSelectedEndDate: b-hour = {0}, e-hour = {1}", DateUtil.getHourOf( this.selectedBeginDate ), DateUtil.getHourOf( this.selectedEndDate ) );

        if ( DateUtil.isSameDay( this.selectedBeginDate, this.selectedEndDate ) &&
            ( DateUtil.getHourOf( this.selectedEndDate ) < DateUtil.getHourOf( this.selectedBeginDate ) ) ||
              DateUtil.getHourOf( this.selectedEndDate ) == DateUtil.getHourOf( this.selectedBeginDate ) && DateUtil.getMinuteOf( this.selectedEndDate ) <= DateUtil.getMinuteOf( this.selectedBeginDate ) )
        {
            this.log.info( "Adjusting selected end date!" );

            this.selectedEndDate = DateUtil.addOneMinuteTo( DateUtil.copyTime( this.selectedBeginDate, this.selectedEndDate ) );
        }
    }
}

这需要我们添加@this to the update每个的属性p:calendar这样各个吸气剂(getSelectedBeginDate() and getSelectedEndDate+ 最小/最大限制器)将在更新期间被调用。

放置一个@this然而,更新混淆了 p:calendar 组件,使得时间滑块只能滑动一次。随后的滑块事件将被简单地忽略,表现出损坏。

Q's

  • 您通常如何解决这个问题?
  • 正在使用p:remoteCommand如何实现我们想要的?

可选Q:

  • 为什么 PrimeFaces p:calendar 没有被实现来提供单个 minDateTime 和 maxDateTime,这可能会解决当前的问题?

我敢打赌我描述的这个场景以前已经解决过。如果您能描述您设法解决此问题的方法(甚至分享部分解决方案),我将非常感激。


Preface:

我不使用 JSF,但有一些事情可能会引导您回到您想要的位置:

a) when 仅使用标准日历中日期时间的日期部分 https://stackoverflow.com/questions/13198609/java-calendar-getting-difference-between-two-dates-times-off-by-one,考虑使用:

someCalendar.set(Calendar.MILLISECOND, 0)

b) 考虑使用乔达时间 http://joda-time.sourceforge.net/,因为它似乎经常被推荐(here https://stackoverflow.com/questions/589870/should-i-use-java-date-and-time-classes-or-go-with-a-3rd-party-library-like-joda/589940#589940, here https://stackoverflow.com/questions/589870/should-i-use-java-date-and-time-classes-or-go-with-a-3rd-party-library-like-joda , and 许多其他地方 https://stackoverflow.com/questions/tagged/jodatime)在许多情况下的正确性、性能和易用性方面优于标准库。

c) 确保您的 bean 作用域在每个 ajax 调用中都存在(不重定向,仅发送标准回发等),并且每个事件处理程序正在获取 faces 上下文(例如FacesContext facesContext = FacesContext.getCurrentInstance();)

d) mindate类似的事情可能不会像你期望的那样工作,而且我不认为自动行为可以如此容易地插入。

当这些选项不可用时,您必须用现有的资源自己完成所有操作:

哲学/用户体验:我要做的第一件事就是消除对约会的安排或观点的期望。不要将这对视为在时间轴上暴露或期望方向的向量。

  • 换句话说,是一个start or from日期总是小于或早于end or to日期?不,正如历史数据查询或对尚未发生或已经发生的事件进行更正所看到的那样?

    这种含义很容易让用户感到困惑,不知道他们是要“返回”还是“前进”(并且很容易让自己感到困惑)。相反,我会将一对之间有时间段的日期视为公正且简单的a pair of dates or a range or a period声明一个间隔,并根据任何随后选择的值推断它们在时间轴上的相对位置。通过这种方式,您可以满足各自的固有要求,即日期永远不会相等,并且左侧始终位于左侧,右侧始终位于右侧。

我们无法推断出“开始”或“从”的含义,但我们可以推断出一些含义和相对关系:时间轴上的右、左和之间。注意:在进行任何计算或比较之前,始终将日期解析为 UTC。

long oneDateValue = oneDate.toUtc().toMilliseconds();
long anotherDateValue = anotherDate.toUtc().toMilliseconds();

long right = max (oneDateValue, anotherDateValue);
long left = min (oneDateValue, anotherDateValue);

评估精度:在使用任何语言处理一系列日期时,我要考虑的第二件事与处理浮点数的方式类似。对于比较,不要比较相等性,而是将增量与“可接受的错误级别”进行比较。换句话说,应用程序实际上只关心一定程度的精度,因此请确保仅捕获和考虑该精度:

const int dateTimeResolutionInMs = 86400000; // milliseconds per day

public bool areEssentiallySame(long left, long right) {

   // the difference between right and left is less than our precision 
   // requires, thus dates are effectively the same
   return (right - left < dateTimeResolutionInMs);
}

强制精度:第三,即使在分辨率范围内,我们如何解决数值差异? (我们的应用程序被赋予了比它可以处理、期望或需要更高的精度)。

long diff = value % dateTimeResolutionInMs;

  1. 截短:return value - diff;

  2. 最近的(带偏差):return value + (diff < dateTimeResolutionInMs/ 2) ? -1 * diff : dateTimeResolutionInMs - diff;

  3. 其他:还有许多其他策略可以将值缩小或扩大到首选分辨率或精度

附录:至于让回发/Ajax 调用返回一个视图,其中包含您期望的事件触发的值calendar元素,如果前言中的注释没有让您得到任何帮助,您可能希望将该问题与一个新问题分开,并且您确定您的 bean 已正确注册和识别。 https://stackoverflow.com/questions/11012301/how-to-set-currentdate-as-mindate-in-calendar-component-of-primefaces您可能会遇到一些特定于浏览器/浏览器版本的问题,这些问题会导致不良行为,并且与其他任何问题一样,也存在已知和未知的问题。

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

使用 p:calendar 相互限制开始和结束日期时间(无验证) 的相关文章

  • 在Windows Server 2003下如何在本地系统帐户下运行jvisualvm.exe?

    我在带有 Java 1 6 u 20 的 Windows Server 2003 下将 GlassFish 3 0 1 作为 Windows 服务运行 总体上我很满意 我希望能够在这个 JVM 上使用 VisualVM 并使用无法在 Tom
  • 连接外部 Accumulo 实例和 java

    我正在尝试使用 Accumulo 连接到虚拟机 问题是 我无法将其连接到 Java 中 我可以看到 Apache 抛出的网页 但我无法让它与代码一起工作 我认为这是缺乏知识的问题而不是真正的问题 但我找不到这方面的文档 所有示例都使用 lo
  • 使用 proguard 混淆文件名

    我正在使用 proguard 和 Android Studio 混淆我的 apk 当我反编译我的apk时 我可以看到很多文件 例如aaa java aab java ETC 但我项目中的所有文件都有原始名称 有没有办法混淆我的项目的文件名
  • 通过Zuul上传大文件

    我在通过 zuul 上传大文件时遇到问题 我正在使用 apache commons 文件上传 https commons apache org proper commons fileupload https commons apache o
  • 自定义列表字段点击事件

    我正在编写一个应用程序 其中我创建了用于显示列表视图的自定义列表字段 我的 CustomListField 包含连续的一个图像和文本 我正在通过单击列表字段行获取字段更改侦听器 但我也想将字段更改侦听器放在图像上 谁能告诉我我该怎么做 这是
  • 重复的“Access-Control-Allow-Origin: *”标头会破坏 CORS 吗?

    所以我们有一个提供 JSON 服务的 http 资源 它添加了一个 Access Control Allow Origin 旗帜 所以这可以用 CORS 加载 except 所以我被告知 有一些 IE9 怪癖 这意味着这在 IE9 中仍然不
  • 为什么 jar 执行的通配符在 docker CMD 中不起作用?

    我有一个Dockerfile与以下CMD启动我的 Spring Boot 应用程序 FROM java 8 jre CMD java jar app file jar 当我尝试从创建的图像启动容器时 我得到 Error Unable to
  • SAPUI5 等待延迟对象 // 等待 .done() 函数

    我知道有几个线程对此进行讨论 但我认为在 SAPUI5 上下文中没有线程回答有关 SAPUI5 中的延迟 同步调用的一般主题 在我的控制器中我得到 test function var dfd Deferred var sServiceUrl
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • 如何在 IntelliJ IDEA 中运行 akka actor

    来自 Akka 网站文档 然后 这个主要方法将创建所需的基础设施 运行演员 启动给定的主要演员并安排 一旦主要参与者终止 整个应用程序就会关闭 因此 您将能够使用类似于以下的命令运行上面的代码 下列的 java classpath akka
  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • 类更改(例如字段添加或删除)是否保持 Serialized 的向后兼容性?

    我有一个关于 Java 序列化的问题 在这种情况下 您可能需要修改可序列化类并保持向后兼容性 我有丰富的 C 经验 所以请允许我将 Java 与 NET 进行比较 在我的Java场景中 我需要使用Java的运行时序列化机制序列化一个对象 并
  • 如何向页面添加 HTML 页眉和页脚?

    如何使用 itext 从 html 源添加标题到 pdf 目前 我们已经扩展了 PdfPageEventHelper 并重写了这些方法 工作正常 但当我到达 2 个以上页面时 它会抛出 RuntimeWorkerException Over
  • Lombok 不适用于 Eclipse Neon

    我下载了lombok jar lombok 1 16 14 jar 并将其放入我的下载中 然后我点击这个 jar 执行正确地识别了我的 MacOS 上的 Eclipse 实例 然后我选择了我想要的实例 Lombok也在pom xml中指定
  • titledBorder 标题中的图标

    您好 是否可以在 titledBorder 的标题中放置一个图标 例如以下代码 import java awt GridLayout import javax swing JFrame import javax swing JLabel i
  • Android计算两个日期之间的天数

    我编写了以下代码来查找两个日期之间的天数 startDateValue new Date startDate endDateValue new Date endDate long diff endDateValue getTime star
  • 用于请求带有临时缓存的远程 Observable 的 RxJava 模式

    用例是这样的 我想暂时缓存最新发出的昂贵的Observable响应 但在它过期后 返回到昂贵的源Observable并再次缓存它 等等 一个非常基本的网络缓存场景 但我真的很难让它工作 private Observable
  • Spring Data Rest 多对多 POST

    首先 让我解释一下我的用例 这非常简单 有一个用户实体和一个服务实体 我使用 UserService 作为连接实体 连接表 在用户和服务之间建立多对多关联最初 会有一些用户集和一些服务集 用户可以在任何时间点订阅任何服务 在这种情况下 将向
  • 如何让 Firebase 与 Java 后端配合使用

    首先 如果这个问题过于抽象或不适合本网站 我想表示歉意 我真的不知道还能去哪里问 目前我已经在 iOS 和 Android 上开发了应用程序 他们将所有状态保存在 Firebase 中 因此所有内容都会立即保存到 Firebase 实时数据
  • Java 的“&&”与“&”运算符

    我使用的示例来自 Java Herbert Schildt 的完整参考文献 第 12 版 Java 是 14 他给出了以下 2 个示例 如果阻止 第一个是好的 第二个是错误的 因此发表评论 public class PatternMatch

随机推荐

  • C# 表单控件移动

    是否有办法控制可以移动表单的位置 因此 如果我移动表单 它只能在垂直轴上移动 当我尝试水平移动它时 什么也不会发生 我不想要一个有缺陷的实现 比如位置更改或移动事件并将其内联弹出 我没有办法使用 WndProc 覆盖之类的东西 但搜索了一段
  • 为什么 C# 4.0 允许匿名对象初始化代码中的尾随逗号? [复制]

    这个问题在这里已经有答案了 可能的重复 内联属性初始化和尾随逗号 https stackoverflow com questions 5245152 inline property initialisation and trailing c
  • 如何根据给定的计数动态添加单选按钮?

    我已经尝试过这段代码 当模拟器启动时 它将在一行中显示三个单选按钮 但我需要一个按钮事件 IE 如果我单击该按钮 它应该询问单选按钮的数量 那么如果我给出计数 它必须根据给定的计数显示单选按钮 例如 如果我将计数指定为 3 则它必须在一行中
  • 为类模板声明用户定义的 OpenMP 缩减

    使用 OpenMP 时 我想为类模板声明用户定义的缩减 include
  • 如何在 Prometheus 或 Grafana 上编写“或”逻辑运算符

    我需要编写一个使用我定义的任何不同作业的查询 job traefik OR job cadvisor OR job prometheus 是否可以编写逻辑二元运算符 普罗米修斯有一个or逻辑二元运算符 但您在这里问的是向量选择器 您可以为此
  • 当 UserControl 更改可见性时聚焦于 TextBox

    我在画布内加载了一个用户控件 默认情况下 此用户控件的可见性已折叠 当我的窗口的特定文本框聚焦时 用户控件变得可见 当用户控件变得可见时 我想将焦点设置到用户控件内的另一个文本框 我尝试这样做 private void UserContro
  • 从 USRP N210 设备检索数据

    N210 连接到 RF 前端 该前端使用 GNU Radio Companion 进行配置 我可以通过 FFT 图看到信号 我需要接收到的信号 usrp2 输出 作为数字 usrp sense spectrum py 也将功率和噪声地板输出
  • 即使有 0 个连接,Aws Aurora Serverless v2 也不会缩减至 0.5 ACU

    我正在运行一个 v2 实例 并且根据 aws 文档 您应该只为实际使用的资源付费 我有一个实例 大多数时候连接数为 0 但它永远不会缩减到 2 个 ACU 以下 请参阅下面的图片以供参考 我的实例设置在 0 5 16ACU 之间扩展 但负载
  • 如何更改使用“rails new”命令创建的默认 gemfile?

    我最近遇到一个问题 我必须将以下内容添加到我的 gemfile 中 gem execjs gem therubyracer 我必须这样做以避免启动 Rails 服务器时发生 JavaScript 运行时错误 我希望将此修改添加到使用 Rai
  • 评估具有许多未知因素的项目

    我正在开展一个具有许多未知因素的项目 例如将应用程序从一个平台移动到另一个平台 我最初的估计有很大偏差 我无法真正确定这一切何时结束 我该如何处理无法评估这样的项目的情况 这并不是说我要在屏幕上添加一个按钮或设计一个网站 或创建应用程序 甚
  • run()方法后线程继续运行

    我在游戏中播放声音时遇到问题 当处理声音播放的线程退出它的 run 方法时 它不会终止 结束 停止 我知道正是这种方法导致了问题 因为当我将整个事情注释掉时 就不会创建更多线程了 用 JVisualVM 检查 问题是退出 run 方法后线程
  • 在 UWP 应用程序上使用 VB.net 获取 IPGlobalProperties

    我正在 Visual Studio 2017 中使用 VB 编写一个非常简单的通用 Windows 应用程序 该应用程序应该向用户提供基本的网络信息 因此我想使用以下方式收集数据IPGlobalProperties并打印 作为第一个例子 D
  • 如何将种子数据放入SQL Server docker镜像中?

    我有一个使用 ASP NET Core 和 SQL Server 的项目 我正在尝试将所有内容放入 docker 容器中 对于我的应用程序 我需要在数据库中有一些初始数据 我可以使用来自 microsoft microsoft mssql
  • 如何在react-native中实现刮刮卡/视图?

    我正在寻找一个包来在反应本机中实现刮刮卡 我找到了这个图书馆https github com thebylito react native scratch card https github com thebylito react nati
  • 我可以在云函数中以管理员身份使用通配符查询 firestore 吗?

    exports updateRelatedCards functions firestore document topic newTopic onWrite snap context gt const newTopic snap data
  • 联合中的标量成员是否计入公共初始序列?

    In the union U下面 如果a or b是活动成员 是否定义了访问行为c struct A int a struct B int a double b union U A a B b int c In 类 联盟 https tim
  • Materialise 中的 Roboto 字体在 Firefox 中的显示问题

    我在用物化 http materializecss com设计我的一些网页的样式 我注意到 Roboto 字体在 Firefox v43 0 3 中无法正确呈现 但在 Chrome 中看起来不错 两个浏览器都从我的服务器下载 woff2 字
  • 访问查询会自动被截断吗?

    以前可能有人问过这个问题 但我似乎无法在任何地方找到任何相关答案 几周前 我在 Access 2003 中编写了几个长查询 我今天想使用这些查询 发现它们被截断了 查询按其应有的方式开始 并在中间的某个地方显示AS Alias 其余的都不见
  • 使用 LLVM 创建本地字符串

    我正在尝试使用 LLVM 创建一个局部变量来存储字符串 但我的代码当前抛出语法错误 lli test2 ll 8 23 error constant expression type mismatch 1 load 6 x i8 c hell
  • 使用 p:calendar 相互限制开始和结束日期时间(无验证)

    我们需要向用户呈现两个 p calendar 组件 分别代表开始日期和结束日期 两个日期时间都有日期 小时和分钟 PrimeFaces 拥有完美mindate maxdate minHour maxHour minMinute and mi