- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如标题所述,我想知道通过 import java.time.LocalTime
收到的当前时间是否位于设置的持续时间之间。
最后,如果时间是早上,我希望我的程序说“早上好”,如果是下午,则说“下午好”,等等。
这些是我的持续时间:
Duration Morning = Duration.between(LocalTime.of(05,31),
LocalTime.of(11,30));
Duration Noon = Duration.between(LocalTime.of(11,31),
LocalTime.of(13,30));
Duration Afternoon = Duration.between(LocalTime.of(13,31),
LocalTime.of(17,30));
Duration Evening = Duration.between(LocalTime.of(17,31),
LocalTime.of(22,30));
Duration Night = Duration.between(LocalTime.of(22,31),
LocalTime.of(05,30));
我的问题是:如何检查当前时间是否位于其中一个持续时间之间,以及如何将其转换为字符串,以便我可以使用它来发出不同的消息?
最佳答案
正如 JB Nizet 的评论正确指出的那样,持续时间不是一个间隔,也就是说 - 不是固定/锚定在 24 小时时间轴上的。 Java-8 没有区间类。所以你有以下选择:
class ClockInterval {
final LocalTime start;
final LocalTime end;
private ClockInterval(LocalTime start, LocalTime end) {
this.start = start;
this.end = end;
}
static ClockInterval between(LocalTime start, LocalTime end) {
return new ClockInterval(start, end);
}
boolean contains(LocalTime time) {
return !time.isBefore(start) && time.isBefore(end);
}
}
然后(这个极其简约且不完整的类):
ClockInterval morning = ClockInterval.between(LocalTime.of(5, 30), LocalTime.of(11, 30));
ClockInterval noon = ClockInterval.between(LocalTime.of(11, 30), LocalTime.of(13, 30));
ClockInterval afternoon = ClockInterval.between(LocalTime.of(13, 30), LocalTime.of(17, 30));
ClockInterval evening = ClockInterval.between(LocalTime.of(17, 30), LocalTime.of(22, 30));
LocalTime now = LocalTime.now();
if (morning.contains(now)) {
System.out.println("Good morning.");
} else if (noon.contains(now)) {
System.out.println("Good midday.");
} else if (afternoon.contains(now)) {
System.out.println("Good afternoon.");
} else if (evening.contains(now)) {
System.out.println("Good evening.");
} else {
System.out.println("Good night.");
}
最后一个 else 分支涵盖了午夜左右的任何时间,因为到目前为止定义的所有其他间隔都连接在一起,之间没有任何间隙(请参阅下面我关于间隔边界的最后一个注释)。
a) 第一种方式:类 net.time4j.range.ClockInterval
Time4J已经提供了这样的时钟间隔类。只需使用前面的示例并更改当前时间的导入语句和以下行:
PlainTime now = PlainTime.nowInSystemTime();
b) 第二种方式:使用自定义日期周期进行格式化
PlainTime now = PlainTime.nowInSystemTime();
Map<PlainTime, String> dayPeriods = new HashMap<>();
dayPeriods.put(PlainTime.of(5, 30), "morning");
dayPeriods.put(PlainTime.of(11, 30), "midday");
dayPeriods.put(PlainTime.of(13, 30), "afternoon");
dayPeriods.put(PlainTime.of(17, 30), "evening");
dayPeriods.put(PlainTime.of(22, 30), "night");
String p =
ChronoFormatter.setUp(PlainTime.axis(), Locale.ENGLISH)
.addLiteral("Good ")
.addDayPeriod(dayPeriods)
.addLiteral('.')
.build()
.format(now);
System.out.println(p); // Good midday.
应该提到的是,还可以通过模式符号 B 对日周期进行自动本地化支持。但是,此处使用的日周期方案不可自定义,而是源自 Unicode 数据。
String p =
ChronoFormatter.ofTimePattern("'Good' B.", PatternType.CLDR, Locale.ENGLISH)
.with(Attributes.OUTPUT_CONTEXT, OutputContext.STANDALONE)
.format(now);
System.out.println(p); // Good afternoon.
对于英语,此方案用作标准:
day-period-rules: T0600=morning T1200=afternoon T1800=evening T2100=night
一般来说,我建议对与(时钟)时间单位的任何持续时间相关的间隔边界使用半开放方法。这意味着,间隔的开始时间始终包含在内,并且恰好等于前一个间隔的开放结束时间。这样做可以避免间隔之间无意的间隙,并且您可以确保始终与当前时间匹配任何间隔。
但是您尝试以不同的方式对间隔边界进行建模。例如,您选择早上间隔为“05:31/11:30”,接下来的间隔从“11:31”开始。如果当前时间不小心是“11:30:17”(注意第二部分!),那么这样的时间将不匹配任何间隔。
关于java - 检查 LocalTime.now 是否位于设定的持续时间内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40774853/
我在寻找一种优雅的方法来从另一个 LocalTime 中减去一个 LocalTime 时遇到问题,但不是减去一定的秒数或分钟数,而是这样: 本地时差 = 现在 - 之前; 显然这是行不通的,所以实际上
我最近使用 LocalDate.atStartOfDay() 回答了一些问题和 LocalDate.atTime(LocalTime.MIN) . 我想知道为什么没有 LocalDate.atEndO
我正在尝试检查当前时间是否在开始LocalTime 之后和另一个结束LocalTime 之前,即开始时间加 11 小时。如果开始时间是 11:00(结束时间将是 22:00),这会很好地工作。但是,当
为什么当我尝试显示 2 个不同参数的日期时,我将其放入 localtime() 函数,控制台显示 2 个相同的日期? 这是我的代码: #include #include #include int ma
我认为我做的一切都是正确的,但为什么我会得到这个: > Sys.time() [1] "2015-11-09 18:51:17 UTC" Warning messages: 1: In as.POSI
我试图编码一个包含LocalTime joda类型时间的对象。如果您尝试返回晚于12am的时间,则会出现问题,因此在下面的示例中,如果类(class)的开始时间是14:00(2pm),则时间将转换为0
我的代码仅支持 Android 中的 API 级别 >= 26: public static String in = "7:00:00"; public static String in_until
我认为我做的一切都是正确的,但为什么我会得到这个: > Sys.time() [1] "2015-11-09 18:51:17 UTC" Warning messages: 1: In as.POSI
为什么当我尝试显示 2 个具有不同参数的日期时,我将其放入 localtime() 函数,控制台显示 2 个相等的日期? 这是我的代码: #include #include #include int
在我的服务器上运行 date 会得到正确的时间。但是在 C(++) 中使用 localtime() 我得到了错误的时间。 运行日期:Fr 30. Nov 12:15:36 CET 2012 使用 lo
所以,我写了下一个函数: void actualizetime(){ puts("actualizetime called"); //debugging purposes. time_t ra
网上有大量代码让我相信下面的代码会给我当前时间。然而,事实并非如此。我得到了我认为是 UNIX 时代的时间; 1970 年 1 月 1 日 00:00;00。 现在真的很烦人,为什么我不能获得计算机系
我有这段代码可以从“29-02-2016”之类的日期返回星期几,但有时它会给我本地时间 (&t) 中的段错误。 int obterDiaSemana(char *str) { struct tm t
我有一段代码工作得很好,但现在不知何故不起作用。 我正在读取一个 csv 文件,但在读取格式为 4:38 的时间字段时出现错误。 我抛出异常的代码是: LocalTime.parse("4:38",
出于学习目的,我正在用 C++ 编写一个简单的日志记录类。我的代码包含一个返回今天日期字符串的函数。但是,每当调用“localtime”时,我都会收到编译器错误。 std::string get_da
我有一个使用 localtime() 的设置来获取一个带有本地时间的 tm。这一切都很好。 但是,如果我在应用程序运行时更改时区,它不会注意到我更改了时区。 有没有办法告诉它“再看一遍”以刷新到系统时
我正在尝试了解如何构建自定义 DateTimeFormatter为我的申请。我基本上需要处理这样写的时间 "HHMMSS.FFFFFF"。 我使用以下方法获得了 99% 的结果: import sta
我有两个 LocalTime 对象: LocalTime time1 = LocalTime.of(8, 0, 0); LocalTime time2 = LocalTime.of(15, 0, 0)
我想将我的字符串转换为 LocalTime 格式 String s = "1時30分:00"; String ss = s.replace("時", ":").replace("分",
我有一个航类行程计划,我需要在其中获取出发时间和到达时间之间的差异。我从数据中获取这些指定时间作为字符串。这是我的问题: import static java.time.temporal.Chrono
我是一名优秀的程序员,十分优秀!