我的日期字符串是:“10月19日星期三14:34:26 BRST 2016”,我正在尝试将其解析为“dd / MM / yyyy”,但我得到以下例外:
java.text.ParseException: Unparseable date: "Wed Oct 19 14:34:26 BRST 2016" (at offset 20)
方法
public String dataText(int lastintervalo) {
Date mDate = new Date();
String dt = mDate.toString();
SimpleDateFormat sdf = new SimpleDateFormat("EE MMM dd HH:mm:ss z yyyy",
Locale.getDefault());
Calendar c = Calendar.getInstance();
try {
c.setTime(sdf.parse(dt));
} catch (ParseException e) {
e.printStackTrace();
}
sdf.applyPattern("dd/MM/yyyy");
c.add(Calendar.DATE, lastintervalo);
return sdf.format(c.getTime());
}
我已经搜索了google和stackoverflow问题,但似乎没有任何工作
答案 0 :(得分:2)
由于错误消息抱怨偏移量20,即BRST
值,似乎无法解析时区。
请尝试使用此代码,以确保识别出巴西时区:
SimpleDateFormat sdf = new SimpleDateFormat("EE MMM dd HH:mm:ss z yyyy", Locale.US);
sdf.setTimeZone(TimeZone.getTimeZone("America/Sao_Paulo"));
System.out.println(sdf.parse("Wed Oct 19 14:34:26 BRST 2016"));
自从我在美国东部以来,我就打印出这个:
Wed Oct 19 12:34:26 EDT 2016
答案 1 :(得分:1)
ZonedDateTime.parse (
"Wed Oct 19 14:34:26 BRST 2016" ,
DateTimeFormatter.ofPattern ( "EE MMM dd HH:mm:ss z uuuu" )
)
.toLocalDate()
.format(
DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT)
.withLocale( Locale.UK )
)
19/10/16
你正在使用麻烦的旧日期时间类,现在是旧的,取而代之的是java.time类。
切勿使用BRST
或EST
或IST
这样的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
以continent/region
的格式指定proper time zone name。例如,America/Sao_Paulo
。
因此,虽然以下代码适用于此特定情况,但我不建议您交换输入等数据。如果您对数据源有影响,请更改为使用标准ISO 8601格式进行日期时间值的数据交换。
2016-10-19T14:34:26-02:00
更好的是,通过在时方括号中附加时区名称来交换由ZonedDateTime
创建的扩展ISO 8601格式的字符串。
2016-10-19T14:34:26-02:00 [美国/圣保罗]
最重要的是,通常是在交换数据之前将这些值转换为UTC。在java.time中,调用toInstant().toString()
来执行此操作。通常最好在UTC中工作,仅在需要时应用时区,例如向用户显示。
2016-10-19T16:34:26Z
String input = "Wed Oct 19 14:34:26 BRST 2016";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "EE MMM dd HH:mm:ss z uuuu" );
ZonedDateTime zdt = ZonedDateTime.parse ( input , f );
zdt.toString():2016-10-19T14:34:26-02:00 [America / Sao_Paulo]
要查看UTC中的相同时刻,请提取Instant
。
Instant instant = zdt.toInstant();
instant.toString():2016-10-19T16:34:26Z
LocalDate
类表示没有时间且没有时区的仅限日期的值。
LocalDate ld = zdt.toLocalDate();
ld.toString():2016-10-19
要生成其他格式的字符串,请搜索DateTimeFormatter
类的Stack Overflow。通常最好让java.time自动本地化。
要进行本地化,请指定:
FormatStyle
确定字符串的长度或缩写。Locale
确定(a)翻译日期名称,月份名称等的人类语言,以及(b)决定缩写,大小写,标点符号等问题的文化规范。< / LI>
示例:
Locale l = Locale.CANADA_FRENCH ; // Or Locale.US or Locale.ITALY etc.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT).withLocale( l );
String output = ld.format( f );
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,.Calendar
和&amp; java.text.SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 2 :(得分:0)
试试这个..它可能会起作用
SimpleDateFormat sdf = new SimpleDateFormat("EE MMM dd HH:mm:ss z yyyy",
Locale.ENGLISH);