【问题标题】:Simpledateformat parses string date wrong [duplicate]Simpledateformat 解析字符串日期错误 [重复]
【发布时间】:2019-08-02 08:01:39
【问题描述】:

我正在尝试将数据从字符串转换为 Data 类,以便稍后将其与其他数据进行比较。

我的数据格式:dd-MM-yyyy(例如 31-07-2019)。

问题是format.parse("string date") 操作后显示错误的数据格式:

Wed Jul 31 00:00:00 UTC 2019

这是我的代码:

import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.util.*;

public class Program {

    public static void main(String[] args) {
        SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");

        try {
            String dateString = format.format(new Date());
            String dateStr = "31-07-2019";
            Date date = format.parse(dateStr);

            System.out.println(dateString);
            System.out.println(date);
        } catch (ParseException e) {
            System.out.println("ParseError " + e.getMessage());
        }       
    }
}

dateString(即当前日期)解析成功。

【问题讨论】:

  • 基本上,当您调用System.out.println(date); 时,您正在调用System.out.println(date.toString()); - 如果您查看Date 的toString 方法,您会发现它当然没有使用SimpleDateFormat
  • 我该如何管理?
  • 如果您只是担心日期的打印方式,那根本不是解析问题。这是格式问题。
  • SimpleDateFormat 是出了名的麻烦,Date 的设计也很糟糕。两者都已经过时了。我建议您改用现代的LocalDate 和DateTimeFormatter。无论我们是在谈论Date 还是LocalDate,他们都没有,因为不能有格式。由于您希望他们能够比较它们,因此您不必担心这个事实。

标签: java date simpledateformat


【解决方案1】:

这是预期的行为

Date 类表示特定的时间瞬间,以毫秒为单位 精度。

format() 将在“format”中生成日期的字符串表示形式。 parse() 将返回一个日期对象,该对象将始终采用“Fri Aug 02 16:14:21 SGT 2019”格式。

这里需要注意的是,构造函数中提供的模式应该与使用 parse 方法解析的日期格式相同。

【讨论】:

    【解决方案2】:

    使用java.time 而不是java.util 用于日期和时间以及格式化和解析。

    public static void main(String args[]) throws Exception {
        // create a custom formatter for your pattern       
        DateTimeFormatter euroDtf = DateTimeFormatter.ofPattern("dd-MM-yyyy");
        // receive today's date
        LocalDate today = LocalDate.now();
        // parse a date that has the form of your pattern using your custom formatter
        LocalDate parsedDate = LocalDate.parse("31-07-2019", euroDtf);
    
        System.out.println("Today is " + today.format(euroDtf));
        System.out.println("Parsed date is " + parsedDate.format(euroDtf));
    }
    

    【讨论】:

      【解决方案3】:

      我会说 SimpleDateFormat 是旧版,使用 jdk-8 LocalDate

      DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
      LocalDate date1 = LocalDate.parse("31-07-2019",formatter);
      LocalDate date2 = LocalDate.now();
      

      您也可以使用isBefore, isAfter 进行比较

      date1.isAfter(date2);
      date2.isBefore(date2);
      

      默认LocalDate 以ISO-8601 格式返回日期

      ISO-8601 日历系统中没有时区的日期,例如 2007-12-03。

      比较后,您可以使用相同的格式化程序将LocalDate 格式化为字符串

      String date2 = LocalDate.now().format(formatter);
      

      SimpleDateFormat.parse 返回java.util.Date 对象

      public Date parse(String source) throws ParseException
      

      而Date.toString()代表模式的字符串

      public String toString()
      
       Converts this Date object to a String of the form:
      
           dow mon dd hh:mm:ss zzz yyyy
      

      【讨论】:

      • 它向后显示日期,例如:2019-07-31 2019-08-02
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 2011-02-04
      相关资源
      最近更新 更多