问题描述
我需要以YYYYMMDDHHMMss.000Z
的格式在GMT
中以日期格式在20201001220000.000Z
中获取今天时区的午夜。
我对日期感兴趣,而不是一天中的时间。
在我的系统中,当我有一个日期时:20201003
是GMT
的一天,是20201001220000.000Z
的夏季。我问这个问题是因为我需要将yyyyMMddHHmmss.SSSZ
与今天的日期进行比较。
我需要以20201004
格式获取日期(今天午夜)。我系统中的今天20201003220000.000Z
午夜是:20201002220000.000Z
,该日期将与其他日期进行比较,例如REGISTER_OP("UserVecGenerate")
.Input("vast_request_in: Ref(variant)")
.Output("vast_request_out: Ref(variant)");
。问题是我不能午夜。
解决方法
java.time
编辑:
我倾向于理解您希望将今天的日期格式化为自己的格式,以便与采用相同格式的UTC(GMT)中的其他日期时间字符串进行比较。为了比较日期和时间,我建议您比较日期时间对象,而不是字符串。因此有两种选择:
- 解析现有字符串,将其转换为您所在时区中的日期,并将其与今天的日期进行比较。
- 将现有字符串解析为一个时间点。比较今天的开始日期。
让我们在代码中同时看到这两个选项。
1。转换为日期并比较日期:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMddHHmmss.SSSX");
ZoneId zone = ZoneId.systemDefault();
LocalDate today = LocalDate.now(zone);
String gmtString = "20201001220000.000Z";
LocalDate dateFromGmtString = formatter.parse(gmtString,Instant::from)
.atZone(zone)
.toLocalDate();
if (dateFromGmtString.isAfter(today)) {
System.out.println(gmtString + " is in the future");
} else if (dateFromGmtString.isBefore(today)) {
System.out.println(gmtString + " was on a past date");
} else {
System.out.println(gmtString + " is today");
}
输出:
20201001220000.000Z是过去的日期
2。查找今天的开始日期并比较时间
Instant startOfDay = LocalDate.now(zone).atStartOfDay(zone).toInstant();
String gmtString = "20201001220000.000Z";
Instant timeFromGmtString = formatter.parse(gmtString,Instant::from);
if (timeFromGmtString.isBefore(startOfDay)) {
System.out.println(gmtString + " was on a past date");
} else {
System.out.println(gmtString + " is today or later");
}
20201001220000.000Z是过去的日期
原始答案
您可能会遵循以下条件。我建议您使用java.time
(现代的Java日期和时间API)进行日期和时间工作。
DateTimeFormatter sourceFormatter = DateTimeFormatter.ofPattern("uuuuMMddHHmmss.SSSX");
String gmtString = "20201001220000.000Z";
Instant instant = sourceFormatter.parse(gmtString,Instant::from);
LocalDate date = instant.atZone(ZoneId.systemDefault()).toLocalDate();
String dayString = date.format(DateTimeFormatter.BASIC_ISO_DATE);
System.out.println(dayString);
当我在欧洲/华沙时区运行代码时,输出为:
20201002
因此,日期已从格林尼治标准时间10月1日转换为波兰的10月2日。
编辑:
…我怎么能午夜?
要开始新的一天(通常是00:00):
ZonedDateTime startOfDay = time.atZone(ZoneId.systemDefault())
.truncatedTo(ChronoUnit.DAYS);
System.out.println(startOfDay);
2020-10-02T00:00 + 02:00 [欧洲/华沙]
链接: Oracle tutorial: Date Time解释了如何使用java.time。
,尝试一下。
String format = "yyyy-MM-dd HH:mm:ss.SSS O";
ZonedDateTime zdt = ZonedDateTime.now().withZoneSameInstant(ZoneId.of("GMT"));
System.out.println(zdt.format(DateTimeFormatter.ofPattern(format)));
将美国东海岸时间打印为
2020-10-03 14:47:18.809 GMT
您可以根据需要删除空格,破折号和冒号。但不要使用日期或相关的格式化程序,因为它们已过时。使用java.time包中的类。
,您可以执行以下操作:
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
// Today
LocalDate today = LocalDate.now();
// Midnight in the JVM's default time-zone
ZonedDateTime zdt = today.atStartOfDay(ZoneId.systemDefault());
// Printing zdt in its default format i.e. value returned by zdt.toString()
System.out.println(zdt);
// Printing zdt in your custom format
DateTimeFormatter customFormat = DateTimeFormatter.ofPattern("yyyyMMddHHmmss.SSSZ");
String dateTimeStrCustom = zdt.format(customFormat);
System.out.println(dateTimeStrCustom);
}
}
输出:
2020-10-04T00:00+01:00[Europe/London]
20201004000000.000+0100