【问题标题】:How to work with time intervall in java [duplicate]如何在java中使用时间间隔[重复]
【发布时间】:2017-12-18 11:05:49
【问题描述】:

我有这种情况: 我正在尝试对用户对电影院的表达进行练习。 用户目前只能观看一部电影(但如果他愿意,他可以为下一场演出购买另一张票)。 每个节目都有一个开始时间和一个结束时间(所以我可以用时间戳来表示它们)。 我的问题是:我如何添加一个控件,使参加一个节目的用户不能同时购买另一个节目的另一张门票? 我们可以想象一个具有唯一 ID 的用户和一个具有 ID 的电影院。 和第三个对象(Show with an Id, startTime,EndTime)。 我的问题不是很多关于代码实现的问题,而是更多关于逻辑的问题。

一个人在一定的时间间隔内只能参加一个节目。(他不能同时参加两个不同的节目,因为他需要尊重节目的开始时间和结束时间)。出于某种原因,如果用户尝试在同一地点购买另一场演出的另一张门票,他将无法购买,因为他应该在此时间间隔观看一场演出。

【问题讨论】:

  • 向我们展示您到目前为止所做的事情。阅读this
  • 目前还不清楚您到底想要什么。你描述你的想法的方式很好,但我看不出你在哪里陷入困境。只需编写您的代码,当您遇到我们可以讨论的特定问题时再回来。
  • 请先搜索再提问,找到一个比任何人都可以在这里输入更快的答案。

标签: java timestamp logic


【解决方案1】:

在您的预订功能中实施类似钩子的功能。在完成预订之前,将检查是否允许用户预订该特定节目。只有当此检查为正时,才能触发实际的预订进度。这包括在您的系统中。

因为我不知道您的项目是什么样子(例如,您使用的是哪个数据库),所以钩子的实现可能非常多变。如果您可以获得按时间排序的执行用户的节目列表,那将是一个优势。这将允许修复检查是否有任何已预订的节目与新节目重叠。

这个检查的一个可能的伪代码实现可能是:

if (usersShowList.stream().filter(show -> (show.startTime < newShow.startTime && show.endTime > newShow.startTime)).count() <= 0) {
...
}

如果您可以更详细地说明您的问题,这将非常有用,以防您需要更多的 cmets。

【讨论】:

  • 只有当新节目的开始时间在旧节目的时间范围内时,您的条件才会生效。如果旧的 20:00 到 21:30,新的 19:00 到 21:00,你就抓不到了。见stackoverflow.com/questions/17106670/…
【解决方案2】:

我在这里给你一个简单的例子,老电影和新电影。为了你的目的,你需要走得更高,遍历所有电影。

  Calendar cal=Calendar.getInstance();

    //I just add some comments to be clear about the logic.
    //E_new dateEndStartMovie
    //E_old date dataEndOldMovie
   //S_new dateStartMovie
   //S_old dataStartOldMovie

   Date dateStartMovie=new Date();
   cal.setTime(dateStartMovie);
   cal.add(Calendar.HOUR_OF_DAY, 2);
   Date dataEndMovie=cal.getTime();

   cal.add(Calendar.HOUR_OF_DAY, -3);
   Date dataStartOldMovie=cal.getTime();
   cal.add(Calendar.HOUR_OF_DAY, 2);
   Date dataEndOldMovie=cal.getTime();

    System.out.println("data start movie"+dateStartMovie);
    System.out.println("data end movie"+dataEndMovie);
    System.out.println("data start  old movie"+dataStartOldMovie);
    System.out.println("data end old  movie "+dataEndOldMovie);
   if (

           dateStartMovie.getTime() > dataStartOldMovie.getTime() //S_new > S_old

           && dateStartMovie.getTime() < dataEndOldMovie.getTime() //S_new < E_old
           ||
           (dataEndMovie.getTime() > dataStartOldMovie.getTime() //E_new > S_old
           && dataEndMovie.getTime() < dataEndOldMovie.getTime()) //E_new < E_old
           || 
           (dataEndMovie.getTime() > dataEndOldMovie.getTime() //E_new > E_old
           && dateStartMovie.getTime()<dataStartOldMovie.getTime())//S_new < S_old
        // i think that we are missing even S_new < S_old  and F_new > F_old ( i can have more film in a bigger interval so i could not send another ticket if in the big interval the person buy a ticket
        )
           {
       System.out.println("Error.Cannot buy ticket at this time. ");
   }

【讨论】:

  • 让我们都做出一个有意识的决定,不要再回到Calendarjava.util.Date课程,除非我们绝对必须这样做。
  • @M.Prokhorov,你的意思是如果一个邪恶的老板强迫我们使用 Java 1.4 或更早版本? :-)
  • @OleV.V.,在这一点上他甚至不是邪恶的,他只是健忘和粗心。同时修复的安全问题数量很容易证明至少升级到 Java7 是合理的。
  • @OleV.V.例如,部分 Spring API 仍然使用Date(至少我最近看到的几个与调度相关的类,并且这些类没有这些属性的任何备用设置器)。但是,我们不要在此评论线程中进一步扩展它,我们将偏离主题。
  • Uta Alexandru,你的公式不太正确。如果新电影的开始时间和结束时间完全相同,您将无法捕捉到它。如果旧电影是 19:00 到 20:00,新电影是 18:30 到 21:00,则相同。见stackoverflow.com/questions/17106670/…
猜你喜欢
  • 2017-04-06
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 2018-02-17
相关资源
最近更新 更多