Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以正确的格式将LocalDate解析为ZonedDateTime_Java_Java Time_Datetimeformatter - Fatal编程技术网

Java 以正确的格式将LocalDate解析为ZonedDateTime

Java 以正确的格式将LocalDate解析为ZonedDateTime,java,java-time,datetimeformatter,Java,Java Time,Datetimeformatter,鉴于: 和输出: public static void main(String[] args) { String dateString = "2018-07-30T13:36:17.820"; DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter .ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS"); LocalDat

鉴于:

和输出:

public static void main(String[] args) {

   String dateString = "2018-07-30T13:36:17.820";

    DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter
            .ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");

    LocalDate date = LocalDate.parse(dateString, DATE_TIME_FORMATTER);

    ZonedDateTime zonedDateTime = date.atStartOfDay((ZoneOffset.UTC));

    System.out.println(zonedDateTime);
}
…打印秒的模式是什么?这个愚蠢的问题无疑让我有点发疯

我需要:

2018-07-30T00:00Z

LocalDate只保留日期。您需要解析LocalDateTime并转换为ZonedDateTime,这样您就有了预期的秒数

2018-07-30T00:00:00Z

我将java.time.LocalDate更改为java.time.LocalDateTime,如果还想显示秒数,就需要它

    var dateString = "2018-07-30T13:36:17.820";
    var format = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
    var localDate = LocalDateTime.parse(dateString, format);
    var zone = ZoneId.of( "America/Montreal" );
    var zonedDateTime = localDate.atZone(zone);
    System.out.println(zonedDateTime);
输出为:

package com.test;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class DateFormatter {

    public static void main(String[] args) {

        String dateString = "2018-07-30T13:36:17.820";

        DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter
                .ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");

        LocalDateTime date = LocalDateTime.parse(dateString, DATE_TIME_FORMATTER);

        ZonedDateTime zonedDateTime = date.atZone(ZoneOffset.UTC);


        System.out.println(zonedDateTime);
    }
}

您必须执行以下几个步骤:

  • 字符串
    解析为
    LocalDateTime
    ,因为它包含日期和时间
  • 只提取日期
  • 通过添加一天的开始时间(
    LocalTime.MIN
    =
    00:00:00
    )和一个
    ZoneOffset.UTC
此代码可以执行以下操作:

publicstaticvoidmain(字符串[]args){
String dateString=“2018-07-30T13:36:17.820”;
//解析LocalDateTime
LocalDateTime LocalDateTime=LocalDateTime.parse(dateString);
//提取日期部分
LocalDate LocalDate=localDateTime.toLocalDate();
//通过应用ZoneId将其设置为ZoneDateTime
ZonedDateTime ZonedDateTime=ZonedDateTime.of(localDate,LocalTime.MIN,ZoneOffset.UTC);
//打印结果
System.out.println(zonedDateTime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));
}
输出为

2018-07-30T00:00:00Z
有几种方法可以做到这一点,这只是其中之一,它与大多数其他答案(和评论:-)略有不同。

tl;博士 你在错误的地方使用了错误的东西

  • 解析
    2018-07-30T13:36:17.820
    不需要明确的
    DateTimeFormatter
    ,因为它已经采用了默认格式。而且,这个字符串有日期和时间,而不仅仅是日期;因此,将其解析为
    LocalDateTime
    而不是
    LocalDate
    更有意义。您始终可以使用从
    LocalDateTime
    获取
    LocalDate
  • 使用,它依次用于省略秒和秒分数(如果它们为零)的时间部分。如果您需要一个零秒和分数秒的字符串,则需要使用
    DateTimeFormatter
  • 演示:

    2018-07-30T13:36:17.820Z
    
    import java.time.LocalDateTime;
    import java.time.ZoneOffset;
    import java.time.ZonedDateTime;
    import java.time.format.DateTimeFormatter;
    
    public class Main {
        public static void main(String args[]) {
            String dateString = "2018-07-30T13:36:17.820";
    
            LocalDateTime localDateTime = LocalDateTime.parse(dateString);// You do not need a DateTimeFormatter here
    
            ZonedDateTime zonedDateTime = localDateTime.toLocalDate().atStartOfDay(ZoneOffset.UTC);
    
            // Print zonedDateTime.toString()
            System.out.println(zonedDateTime);
    
            // Custom format
            final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
            System.out.println(DATE_TIME_FORMATTER.format(zonedDateTime));
        }
    }
    
    输出:

    2018-07-30T13:36:17.820Z
    
    import java.time.LocalDateTime;
    import java.time.ZoneOffset;
    import java.time.ZonedDateTime;
    import java.time.format.DateTimeFormatter;
    
    public class Main {
        public static void main(String args[]) {
            String dateString = "2018-07-30T13:36:17.820";
    
            LocalDateTime localDateTime = LocalDateTime.parse(dateString);// You do not need a DateTimeFormatter here
    
            ZonedDateTime zonedDateTime = localDateTime.toLocalDate().atStartOfDay(ZoneOffset.UTC);
    
            // Print zonedDateTime.toString()
            System.out.println(zonedDateTime);
    
            // Custom format
            final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
            System.out.println(DATE_TIME_FORMATTER.format(zonedDateTime));
        }
    }
    

    了解有关现代日期时间API的更多信息,只需使用
    日期时间格式
    。您清楚地知道如何使用它…还请注意,如果您只想将ZDT的时间部分设置为00:00,您可以使用
    truncatedTo(ChronoUnit.DAYS)
    。无需首先解析到
    LocalDate
    。谢谢,我就快到了,只是看不见:)@Steerpike hehe,没问题。请考虑所有有用的答案,包括已接受的答案。