如何解决我如何知道当前时间在特定时区的凌晨5点
我的系统时区是utc。 我怎么知道如果使用Java日期时间api在给定的时区中凌晨5点?
如何为此使用区域日期时间?
现在是新加坡凌晨5点吗? 现在是印度的凌晨5点吗? 现在是奥地利的凌晨5点吗?
谢谢
这是我的最终逻辑。在完成以下解决方案后。
public class MorningReminderScheduler {
@Scheduled( cron="0 0/5 * * * * ")
public static void main(String args[]){
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
for (String zoneId : ZoneId.getAvailableZoneIds()) {
ZoneId z = ZoneId.of(zoneId);
// LocalDateTime -> ZonedDateTime
LocalTime l= LocalTime.now(z);
if(l.getHour()==5 && l.getMinute()<5){
System.out.println("its between 5 hour to 5 hour 5 min in = " + z.getId());
}
}
}
}
解决方法
您可以使用LocalTime类在任何支持时区中找到本地时间。例如:
String zoneId = "Asia/Singapore";
LocalTime timeInSingapore = LocalTime.now(ZoneId.of(zoneId));
要确定是否在新加坡凌晨5点,您可能需要设置一些阈值,因为在很短的时间内,时间恰好是凌晨5点。您可以做的是计算凌晨5点与给定时刻之间的时差,如果该差值“足够小”,则可以声明为凌晨5点。例如,这将声称时间是4:50到5:10之间的任何时间凌晨5点:
LocalTime fiveAm = LocalTime.of(5,0);
long minutesBetween = Math.abs(ChronoUnit.MINUTES.between(fiveAm,timeInSingapore));
if (minutesBetween <= 10) {
// close enough
System.out.println("It's 5am in " + zoneId);
}
,
您可以使用要知道其时间的时区的zoneId。使用DateFormatter格式化日期,然后验证是否为5:00 AM。示例代码如下:
public static void getCurrentTimeWithTimeZone(){
System.out.println("-----Current time of a different time zone using LocalTime-----");
ZoneId zoneId = ZoneId.of("America/Los_Angeles");
LocalTime localTime=LocalTime.now(zoneId);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
String formattedTime=localTime.format(formatter);
System.out.println("Current time of the day in Los Angeles: " + formattedTime);
if(formattedTime.equals("05:00:00")
System.out.println("It is 5 AM in Los Angeles");
}
,
假设您说5:00
时的意思是5 am
,即您没有考虑秒和纳秒,则可以将新加坡的小时和分钟与5
和{{1 }}分别评估它是否为0
。
5 am
输出:
import java.time.LocalTime;
import java.time.OffsetTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
// Singapore has the Zone Offset of UTC +8
LocalTime nowAtSingapore = OffsetTime.now().withOffsetSameInstant(ZoneOffset.ofHours(8)).toLocalTime();
System.out.println("Now at Singapore: " + nowAtSingapore);
System.out.println("Now (HH:mm) at Singapore: " + DateTimeFormatter.ofPattern("HH:mm").format(nowAtSingapore));
// Check if it is 5:00 at Singapore now
if (nowAtSingapore.getHour() == 5 && nowAtSingapore.getMinute() == 0) {
System.out.println("It's 5:00 at Singapore");
}
}
}
注意:Now at Singapore: 05:24:43.217733
Now (HH:mm) at Singapore: 05:24
的默认格式为LocalTime.toString()
,其中HH:mm:ss.SSSSSS
表示纳秒。为了获得自定义模式的字符串,我们使用2。
编辑:对于您的cron工作,建议您跟踪该时区发送短信(SMS)的最后日期。因此,如果现在第二天早上5点 之后,请发送下一条消息(并更新存储的日期)。这样即使在5分钟的容忍间隔内恰好无法正常运行作业,也可以确保发送邮件。如果作业恰好运行两次,也不会发送两次。时间很棘手,因为我们永远无法在指定的时间准确地完成事情,因此我们必须考虑这些可能性。
原始答案
否,现在不是印度或您提到的其他时区之一的凌晨5点。某个时区中上午5点的时间点持续0,因此该时间为0的概率。
在许多平台上,Java自Java 9以来就可以以微秒的精度读取时间。因此,即使不是确切是凌晨5点,它也给我们留下了0.000000001%的概率是读取的时间是凌晨5点。仍然只有一分钟,足以说它几乎不会发生。
因此,我建议您以一定的容忍度工作:如果时间足够接近5 AM,则将其视为5 AM。例如:
final LocalTime time = LocalTime.of(5,0); // 5 AM
final Duration tolerance = Duration.ofMillis(600); // 0.6 seconds as an example
ZoneId zone = ZoneId.of("Asia/Kolkata"); // India
LocalTime nowInZone = LocalTime.now(zone);
if (nowInZone.isBefore(time.minus(tolerance)) || nowInZone.isAfter(time.plus(tolerance))) {
System.out.println("No,it is not " + time + " in " + zone);
} else {
System.out.println("Yes,it is " + nowInZone + " in " + zone);
}
当我现在运行代码时,可能会输出:
不,在亚洲/加尔各答,它不是05:00
请注意,只要公差不超过午夜(凌晨12点),代码就只能正常工作。例如,时间为上午0:01,公差为2分钟,我们将检查时间是否在23:59 之后和之后0:03之前。没有时间可以同时是两者,因此即使时间在4分钟以内,我们也总是得到 No 。但是对于凌晨5点且容忍度不足5小时的情况,它确实起作用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。