public class Kf_Date {
public static String getDateUsingOracleFormat(String date) {
try {
DateFormat inputFormat = new SimpleDateFormat("yyy-MM-dd'T'HH:mm:ss.S");
Date date2 = inputFormat.parse(date);
SimpleDateFormat sdf = new SimpleDateFormat("YYY-MM-dd");
String outputText = sdf.format(date2);
return outputText;
} catch(Exception e) {
e.printStackTrace();
return e.toString();
}
}
public static void main(String... args) {
System.out.println(new Kf_Date().getDateUsingOracleFormat("2018-08-02T00:00:00+05:30"));
}
}
答案 0 :(得分:3)
您可以使用DateTimeFormatter
:
DateTimeFormatter.ofPattern("yyyy-MM-dd")
.format(ZonedDateTime.parse("2018-08-02T00:00:00+05:30"))
返回"2018-08-02"
。上面的parse
调用了解您输入的ISO格式。
这是较新的推荐API。如果您使用的Java版本早于8,则应使用:
Date input = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX")
.parse("2018-08-02T00:00:00+05:30");
String output = new SimpleDateFormat("yyyy-MM-dd")
.format(input);
这将返回相同的字符串。
答案 1 :(得分:2)
public static String getDateUsingOracleFormat(String date) {
OffsetDateTime dateTime = OffsetDateTime.parse(date);
String outputText = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE);
return outputText;
}
使用此方法声明,您的main
打印:
2018-08-02
您的两种格式(正在解析的格式和正在生成的格式)均符合ISO 8601(底部的链接)。现代Java日期和时间API java.time类解析并打印此格式为默认格式,即没有任何显式格式化程序。格式器也是内置的,因此我使用一种格式器来指定我们要格式化的日期没有日期和与UTC的偏移量。无需编写自己的格式化程序就容易出错。
正如其他人所说,您的格式模式字符串与您尝试解析100%的日期时间字符串不匹配。格式要求在那秒之后应该有一个点和几毫秒。相反,您的字符串有一个偏移量+05:30
。这导致异常。相比之下,一个参数OffsetDateTime.parse
可以接受带或不带毫秒的字符串(因为它们在ISO 8601中是可选的)(但确实需要偏移量)。
您的代码中还有一个错误:您要格式化的格式模式中使用大写YYY
。这有时会给您错误的年份。小写y
用于年份。大写的Y
用于年份,仅与星期编号一起使用。
此外,由于您的方法是静态的,因此您无需创建实例来调用它。只要做:
System.out.println(Kf_Date.getDateUsingOracleFormat("2018-08-02T00:00:00+05:30"));
java.time
。答案 2 :(得分:1)
除此行外,您具有正确的代码。在输入模式中使用 XXX 代替 .S :
DateFormat inputFormat = new SimpleDateFormat("yyy-MM-dd'T'HH:mm:ssXXX");
提示:
如果您在解析日期字符串时遇到问题,并且不知道模式中出了什么问题,那么只需打印当前日期并将其与输入字符串进行比较即可。然后,您可以看到差异并修复模式:
DateFormat inputFormat = new SimpleDateFormat("yyy-MM-dd'T'HH:mm:ss.S");
System.out.println(inputFormat.format(new Date())); // 2018-08-07T08:28:33.800
inputFormat = new SimpleDateFormat("yyy-MM-dd'T'HH:mm:ssXXX");
System.out.println(inputFormat.format(new Date())); // 2018-08-07T08:28:33+03:00
答案 3 :(得分:1)
您可以这样使用ISO模式:
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateTimeUtils {
public static String format(String inputDate, String inputFormat, String outputFormat) throws ParseException {
DateFormat fromFormat = new SimpleDateFormat(inputFormat);
fromFormat.setLenient(false);
DateFormat toFormat = new SimpleDateFormat(outputFormat);
toFormat.setLenient(false);
Date date = fromFormat.parse(inputDate);
return toFormat.format(date);
}
public static void main(String[] args) throws ParseException {
System.out.println(DateTimeUtils.format("2018-08-02T00:00:00+05:30", "yyyy-MM-dd'T'HH:mm:ssXXX", "yyyy-MM-dd"));
}
}