热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在下午4点和凌晨2点之间的两个时间生成随机时间?

我试过使用-intstartSeconds=restaurant.openingTime.toSecondOfDay();intendSecon

我试过使用 -

int startSecOnds= restaurant.openingTime.toSecondOfDay();
int endSecOnds= restaurant.closingTime.toSecondOfDay();
LocalTime timeBetweenOpenClose = LocalTime.ofSecondOfDay(ThreadLocalRandom.current().nextInt(startSeconds, endSeconds));

但这通常会遇到错误,如 nextInt(origin, bounds), origin 不能小于 bounds,如果 myopeningTime是 16:00:00 和closingTime02:00:00 ,则会发生这种情况。

回答

您可以添加一天的秒数 ( 24*60*60) 当startSeconds大于时endSeconds表示第二天的秒数,并在获得随机数以一天的秒数取模后,通过有效的秒值将其转换为 LocalTime。

int secOndsInDay= (int)Duration.ofDays(1).getSeconds();
if(startSeconds > endSeconds){
endSeconds += secondsInDay;
}
LocalTime timeBetweenOpenClose = LocalTime.ofSecondOfDay(
ThreadLocalRandom.current().nextInt(startSeconds, endSeconds) % secondsInDay);





回答

如果不应用日期和时区,我们无法知道从下午 4 点到凌晨 2 点之间将经过多长时间。因此,我们将使用 解决它ZonedDateTime


  1. 第一步将是:ZonedDateTime通过调用获取LocalDate#atStartOfDay

ZoneId zOneId= ZoneId.systemDefault();
LocalDate.now().atStartOfDay(zoneId);


  1. 接下来,使用ZonedDateTime#with获取ZonedDateTime具有指定时间的 a。

  2. 现在,您可以InstantZonedDateTimeusing派生ZonedDateTime#toInstant

  3. 一旦以Instant这种方式导出start 和 end s,就可以使用ThreadLocalRandom.current().nextLong生成longstart 和 end Instants范围内的值,并使用获得的值来获取所需的Instant.

  4. 最后,您可以ZonedDateTime从这个Instantusing派生 a Instant#atZone,然后使用获得所需的时间ZonedDateTime#toLocalTime

演示:

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.concurrent.ThreadLocalRandom;
public class Main {
public static void main(String[] args) {
// Change it as per the applicable timezone e.g. ZoneId.of("Europe/London")
ZoneId zOneId= ZoneId.systemDefault();
LocalDate today = LocalDate.now();

ZonedDateTime zdtStart = today.atStartOfDay(zoneId)
.with(LocalTime.of(16, 0));

ZonedDateTime zdtEnd = today.plusDays(1)
.atStartOfDay(zoneId)
.with(LocalTime.of(2, 0));

ZonedDateTime zdtResult =
Instant.ofEpochMilli(
ThreadLocalRandom
.current()
.nextLong(
zdtStart.toInstant().toEpochMilli(),
zdtEnd.toInstant().toEpochMilli()
)
).atZone(zoneId);

LocalTime time = zdtResult.toLocalTime();
System.out.println(time);
}
}

Trail: Date Time 中了解有关现代日期时间 API 的更多信息。

ONLINE DEMO 随机打印 100 次。



  • @VaibhavAgrawal A `ZonedDateTime` is a date and time in a time zone. If you want the time for a particular day and it needs to work correctly in all time zones, then you need this because it takes DST transitions and other time line anomalies into account. An `Instant` is a plain point in time (as the name says). The code converts from `LocalTime` to `ZonedDateTime` to `Instant` to milliseconds in order to do the math on the milliseconds values, then converts back to `Instant` to `ZonedDateTime` to `LocalTime`.


  • That's neat @OleV.V. I am getting it now..Thanks!!

    And the issue of _origin less than bounds_ gets solved because EpochMilli returns the number of milliseconds from the epoch of _1970-01-01T00:00:00Z_.

    Although 4 PM and 2 AM were just examples so rather than hardcoding values `LocalTime.of(16, 0)` instead `restaurant.openingTime` can be used. And `ZonedDateTime zdtEnd = today.plusDays(1).atStartOfDay(zoneId).with(LocalTime.of(2, 0));` can be checked using if condition so that if closingTime falls within same day i.e. `if (openingTime.isBefore(closingTime))` then `plusDays(1)` can be removed.





推荐阅读
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • 在C#编程中,数值结果的格式化展示是提高代码可读性和用户体验的重要手段。本文探讨了多种格式化方法和技巧,如使用格式说明符、自定义格式字符串等,以实现对数值结果的精确控制。通过实例演示,展示了如何灵活运用这些技术来满足不同的展示需求。 ... [详细]
  • 本文详细介绍了在 Oracle 数据库中使用 MyBatis 实现增删改查操作的方法。针对查询操作,文章解释了如何通过创建字段映射来处理数据库字段风格与 Java 对象之间的差异,确保查询结果能够正确映射到持久层对象。此外,还探讨了插入、更新和删除操作的具体实现及其最佳实践,帮助开发者高效地管理和操作 Oracle 数据库中的数据。 ... [详细]
  • 在Java基础中,私有静态内部类是一种常见的设计模式,主要用于防止外部类的直接调用或实例化。这种内部类仅服务于其所属的外部类,确保了代码的封装性和安全性。通过分析JDK源码,我们可以发现许多常用类中都包含了私有静态内部类,这些内部类虽然功能强大,但其复杂性往往让人感到困惑。本文将深入探讨私有静态内部类的作用、实现方式及其在实际开发中的应用,帮助读者更好地理解和使用这一重要的编程技巧。 ... [详细]
  • 本文详细探讨了使用纯JavaScript开发经典贪吃蛇游戏的技术细节和实现方法。通过具体的代码示例,深入解析了游戏逻辑、动画效果及用户交互的实现过程,为开发者提供了宝贵的参考和实践经验。 ... [详细]
  • HTML 页面中调用 JavaScript 函数生成随机数值并自动展示
    在HTML页面中,通过调用JavaScript函数生成随机数值,并将其自动展示在页面上。具体实现包括构建HTML页面结构,定义JavaScript函数以生成随机数,以及在页面加载时自动调用该函数并将结果呈现给用户。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • 利用 Spring BeanUtils 实现 JavaBean 的深度克隆与属性复制 ... [详细]
  • 优化后的标题:深入解析09版Jedis客户端
    深入解析09版Jedis客户端,本文将详细介绍如何在Java项目中正确配置Jedis以操作Redis。首先,确保项目的JDK版本和编译器设置正确。接着,通过Maven或Gradle导入必要的依赖项,如 `redis.clients:jedis`。此外,文章还将探讨Jedis连接池的配置与优化,以及常见问题的解决方案,帮助开发者高效使用Jedis进行Redis操作。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • Java 零基础入门:SQL Server 学习笔记(第21篇)
    Java 零基础入门:SQL Server 学习笔记(第21篇) ... [详细]
  • 在C#和ASP.NET开发中,TypeParse 是一个非常实用的类型解析扩展方法库,提供了简便的类型转换功能。例如,通过 `var int1 = "12".TryToInt();` 可以将字符串安全地转换为整数,如果转换失败则返回0。此外,还支持更多复杂的类型转换场景,如 `var int2 = "22x".TryToInt();` 和 `var int3 = "3.14".TryToInt();`,确保了代码的健壮性和易用性。 ... [详细]
  • 出库管理 | 零件设计中的状态模式学习心得与应用分析
    出库管理 | 零件设计中的状态模式学习心得与应用分析 ... [详细]
author-avatar
YW1232602897663_231
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有