首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java的SimpleDateFormat中,StringDate to Date出现的时间不同。

在java的SimpleDateFormat中,StringDate to Date出现的时间不同。
EN

Stack Overflow用户
提问于 2020-02-26 14:53:25
回答 1查看 398关注 0票数 1
代码语言:javascript
复制
    /*I want the same Date of my String has
     Tried with couple of options but nothing worked 
     pasting some of code here */

    public void stringToDate() {

        //Current format "13-FEB-20 03.21.08.100000000 PM" in Melbourne Timezone
        //Required Format yyyy-dd-MM HH:mm:ss.SSS in Melbourne Timezone

        String inputAM = "13-FEB-20 03.21.08.100000000 PM";
        try {
            DateFormat df1 = new SimpleDateFormat("dd-MMM-yy hh.mm.ss.S aa");
            Date d1 = df1.parse(inputAM);
            System.out.println("Date-1: " + d1); //Fri Feb 14 19:07:48 AEDT 2020

            DateFormat df2 = new SimpleDateFormat("DD-MMM-yy hh.mm.ss.S aa");
            Date d2 = df2.parse(inputAM);
            System.out.println("Date-2: " + d2); //Tue Jan 14 19:07:48 AEDT 2020

        } catch (ParseException e) {
            e.printStackTrace();
        }

        SimpleDateFormat etDf = new SimpleDateFormat("yyyy-dd-MM HH:mm:ss.SSS");
        TimeZone etTimeZone = TimeZone.getTimeZone("Australia/Melbourne");
        etDf.setTimeZone(etTimeZone);

        DateFormat df3 = new SimpleDateFormat("dd-MMM-yy HH.mm.ss.SSSSSSSSS a");
        Date d3;
        try {
            d3 = df3.parse(inputAM);
            System.out.println("Date-3: " + d3); //Fri Feb 14 07:07:48 AEDT 2020
            System.out.println("Date-4: " + etDf.format(d3.getTime())); //2020-14-02 07:07:48.000
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2020-02-26 16:10:58

首先,在大多数情况下,不要将日期和时间从一种字符串格式转换为另一种字符串格式。在您的程序中,将日期和时间作为适当的日期-时间对象,而不是字符串。当您接受字符串输入时,首先要对其进行解析。仅当您需要提供字符串输出时,才将日期时间格式化为所需格式的字符串。

其次,对所有日期和时间工作使用java.time,这是现代Java date and time API。与旧的、设计糟糕的和长期过时的类(包括DateFormatSimpleDateFormatDate )相比,使用它要好得多。

使用java.time解析您的输入

代码语言:javascript
复制
    //Current format "13-FEB-20 03.21.08.100000000 PM" in Melbourne Timezone
    DateTimeFormatter currentFormatter = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendPattern("d-MMM-uu hh.mm.ss.SSSSSSSSS a")
            .toFormatter(Locale.ENGLISH);
    ZoneId zone = ZoneId.of("Australia/Melbourne");

    String inputAM = "13-FEB-20 03.21.08.100000000 PM";

    ZonedDateTime dateTime = LocalDateTime.parse(inputAM, currentFormatter).atZone(zone);

    System.out.println(dateTime);

到目前为止,输出是:

2020-02-13T15:21:08.100+11:00Australia/Melbourne

使用java.time格式化

代码语言:javascript
复制
    //Required Format yyyy-dd-MM HH:mm:ss.SSS in Melbourne Timezone
    DateTimeFormatter requiredFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS");
    String formatted = dateTime.format(requiredFormatter);
    System.out.println(formatted);

2020-02-13 15:21:08.100

你的代码出了什么问题?

当我第一次尝试您的代码时,解析FEB失败了,因为您的代码没有指定地区,而我的Java使用了非英语的默认地区。

更正后,我能够解析字符串,并获得与您相同的结果(仅在我的时区)。结果:无论要解析的字符串中有多少个S,无论字符串中有多少位数字,SimpleDateFormat都会采用大写S来表示毫秒,千分之一秒。因此,将100,000,000毫秒添加到您的日期和时间。这是一天多一点的时间。所以你得到的是14号而不是13号,而且一天中的时间也不对。与现代的DateTimeFormatter大写形式不同,S表示秒的分数,因此它以我们期望的方式同时处理SSSSSSSSSSSS

大写的DD表示一年中的某一天,所以使用它来解析你得到了一年中的第13天(与1月13日相同)加上你的100000秒。

大写HH表示从00到23的一天中的小时。使用HH解析得到的结果是一天中的03:21 (与凌晨03:21相同),再加上100000秒,不管字符串中写的是PM

链接

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60408294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档