Java日期,格式为:YYYYMMDDHHMMss.000Z作为GMT

问题描述

我需要以YYYYMMDDHHMMss.000Z的格式在GMT中以日期格式在20201001220000.000Z获取今天时区的午夜。 我对日期感兴趣,而不是一天中的时间。 在我的系统中,当我有一个日期时:20201003GMT的一天,是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. 解析现有字符串,将其转换为您所在时区中的日期,并将其与今天的日期进行比较。
  2. 将现有字符串解析为一个时间点。比较今天的开始日期。

让我们在代码中同时看到这两个选项。

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