【问题标题】:Java date with the format : YYYYMMDDHHMMss.000Z as GMTJava 日期格式为:YYYYMMDDHHMMss.000Z 作为 GMT
【发布时间】:2020-10-03 14:21:47
【问题描述】:

我需要以YYYYMMDDHHMMss.000Z 格式在我的时区午夜获取今天的日期作为GMT 中的日期和时间。 我对日期感兴趣,而不是一天中的时间。 在我的系统中,当我有一个约会时:20201001220000.000Z 这是20201003 的一天,作为GMT 的夏令时。我问这个问题是因为我需要将20201001220000.000Z 与今天的日期进行比较。

我需要以yyyyMMddHHmmss.SSSZ 格式获取日期(今天午夜)。今天午夜 20201004 在我的系统中是:20201003220000.000Z 此日期将与其他日期进行比较,例如 20201002220000.000Z。问题是我不能到午夜。

【问题讨论】:

  • 您在寻找this吗?另外,您所说的“GMT 夏令时间”是什么意思?
  • String pattern = "YYYYMMDDHHMM.SSSZ"; // YYYYMMDDHHMMss.000Z SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern); String date = simpleDateFormat.format(new Date()); System.out.println(date);
  • 不太清楚,抱歉。您是否有类似20201001220000.000Z 的字符串,并且您只想将其转换为您自己时区的日期,例如20201003,并考虑您所在时区的夏季时间?
  • 这会给你一个java.time的好图:stackoverflow.com/questions/32437550/…
  • @ArvindKumarAvinash 我理解其中的区别。我犯了一个错误。

标签: java date datetime datetime-format


【解决方案1】:

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 日期和时间 API java.time 进行日期和时间工作。

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。

【讨论】:

  • 感谢 Piotr Piskorz 提供了更清晰的信息。我已经重写了答案。
【解决方案2】:

试试这个。

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

您可以根据需要删除空格、破折号和冒号。但是不要使用 Date 或相关的格式化程序,因为它们已经过时了。使用 java.time 包中的类。

【讨论】:

    【解决方案3】:

    你可以这样做:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-13
      • 2015-04-30
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      • 2017-11-10
      • 2018-09-29
      相关资源
      最近更新 更多