在转换字符串值

时间:2016-01-13 20:22:27

标签: java date simpledateformat

我正在尝试使用文本框字段(由字符串wkCreation字段表示)并将数据转换为" YYYY-MM-DD"中的日期字段。格式。这是我现在使用SimpleDateFormat

的代码
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
    Date convertdate = format.parse(wkCreation);
    wkCreationFormat = format.format(convertdate) ;
    System.out.println("Convertdate field  = " + convertdate);
    System.out.println("Creation Format field = " + wkCreationFormat);
} 
catch (ParseException e) {
    e.printStackTrace();
}

如果用户将日期实际设置为与SimpleDateFormat模式相同的格式,这似乎是我能够实现此功能的唯一方法,这实际上违背了我的想法。我正试图在' mm / dd / yy'或者' mm / dd / yyyy'格式转换为' YYYY-MM-DD'格式。除了常见的Java感觉,我还想念她吗?我在想我convertdate的定义是错误的但不知道

3 个答案:

答案 0 :(得分:1)

SimpleDateFormat的目的是将String转换为Date,这并不像您想象的那么容易。如果我有约会01/02/2015,您知道它是2月1日还是1月2日。答案是,你不知道,你需要额外的提示(输入)来进行正确的转换 - 格式。

您可以编写自己的格式,支持多种格式,例如:

package q34776322;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class MultiDateFormat {

    String[] supportedFormats;

    public MultiDateFormat(String... formats) {
        supportedFormats = Arrays.copyOf(formats, formats.length);
    }

    public Date parse(String dateString) {
        Date foundDate = null;
        for (String format : supportedFormats) {
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            try {
                Date tmp = sdf.parse(dateString);
                if (foundDate != null) {
                    // correct parsing, but it was at parsed before => error
                    throw new IllegalArgumentException("Unparsable date: '" + dateString + "' (multiple pattern matches)");
                } else {
                    foundDate = tmp;
                }
            } catch (ParseException pe) {

            }
        }
        if (foundDate == null) {
            throw new IllegalArgumentException("Unparsable date: '" + dateString + "' (no pattern match)");
        }
        return foundDate;
    }


    public static void main(String[] args) {
        MultiDateFormat mdf = new MultiDateFormat("yyyy-MM-dd", "dd/MM/yyyy");
        mdf.parse("2015-02-01"); // February 1st
        mdf.parse("01/02/2015"); // February 1st again

        mdf = new MultiDateFormat("MM/dd/yyyy", "dd/MM/yyyy");
        try {
            mdf.parse("01/02/2015");
        } catch (Exception e) {
            System.out.println("Expected exception");
        }
    }

}

这基本上是尝试所有格式 - 如果没有合适或有多个适合,则抛出异常......

答案 1 :(得分:1)

距离正确的代码只有一步之遥。您错过的是您正在处理两种不同的日期格式:

  

我正在尝试以'mm / dd / yy'或'mm / dd / yyyy'格式获取某些内容,以转换为'YYYY-MM-DD'格式

在这种情况下,您只需要两个或多或少的格式化程序:

SimpleDateFormat inputParser = new SimpleDateFormat("MM/dd/yyyy");
SimpleDateFormat outputFormatter = new SimpleDateFormat("yyyy-MM-dd");
try {
  Date convertdate = inputParser.parse(wkCreation);
  wkCreationFormat = outputFormatter.format(convertdate) ;
  System.out.println("Convertdate field  = " + convertdate);
  System.out.println("Creation Format field = " + wkCreationFormat);

一个用于解析预期的输入,另一个用于解析所需的输出。

要解析输入,您当然需要以预期的格式向用户提供灵活性或明确的说明。

答案 2 :(得分:0)

字符串不是日期时间对象

字符串不是日期时间对象。如果您的字符串是日期时间值的文本表示,则必须将该值解析为到日期时间对象中。然后使用该日期时间对象生成另一个字符串作为备用格式的日期时间值的另一个文本表示。因此,为解析定义了一种格式,另一种为生成定义的格式。

无法解析任何日期时间格式

使用任何可想到的格式从逻辑上解析String中的日期值是不可能的。例如:1/2/3 ...这是月份,日期,缩写年份?您必须为数据输入用户定义一种或多种预期格式。进行解析尝试,捕获预期的解析异常,重复直到有效。这已在StackOverflow上多次覆盖,因此如果想法不明确,请搜索示例代码。

java.time

您正在使用现在由Java 8及更高版本中的java.time框架取代的麻烦的旧日期时间类。

此框架包含一个类LocalDate,用于表示没有时间或时区的仅限日期的值。

必须使用编码模式指定预期输入的两种格式。代码类似于java.text.SimpleDateFormat的代码,但不完全相同。务必仔细研究该文档。

String input = "12/01/2015" ;
DateTimeFormatter formatterInput = DateTimeFormatter.ofPattern( "MM/dd/yyyy" );
try {
    LocalDate localDate = LocalDate.parse( input , formatterInput );
}  catch ( DateTimeParseException e ) {
       // FIXME: handle exception
}

您想要的输出格式yyyy-MM-dd恰好符合ISO 8601标准。 java.time框架使用此标准,因为它在解析和生成日期时间值的文本表示时是默认的。 DateTimeFormatter类包含各种ISO 8601格式的常量,包括ISO_LOCAL_DATE,即您想要的格式。

DateTimeFormatter formatterOutput = DateTimeFormatter.ISO_LOCAL_DATE ;
String output = localDate.format( formatterOutput );