2017-02-23 65 views
-2
public static void main(String[] args) { 
     Date now = new Date(); 

     String dateString = now.toString(); 
     System.out.println(" 1. " + dateString); 

     SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"); 

     try { 
      Date parsed = format.parse(dateString); 
      System.out.println(" 2. " + parsed.toString()); 
     } catch (ParseException pe) { 
      System.out.println("ERROR: Cannot parse \"" + dateString + "\""); 
     } 

     System.out.println(" 3. " + format.format(now)); 
    } 

打印控制台:代替java SimpleDateFormat?

1. Thu Feb 23 17:14:51 CET 2017 
ERROR: Cannot parse "Thu Feb 23 17:14:51 CET 2017" 
3. jeu. févr. 23 05:14:51 CET 2017 

1. Thu Feb 23 17:14:51 CET 2017 
2. Thu Feb 23 17:14:51 CET 2017 
3. jeu. févr. 23 05:14:51 CET 2017 
+2

您没有。 3表示您的系统区域设置为法语,因此格式化程序无法识别“Thu Feb”,因为它只需要法文名称。 – Thomas

+2

Bonjour,为什么你仍然在使用老式的Date类和SimpleDateFormat类吗? 'java.time'中的新类(自Java 8以来)具有'toString'和'parse'方法,这些方法对默认格式和区域设置保持一致,这样可以为您节省像这样的问题。 –

回答

3

它看起来像你的默认LocaleFRENCH,由于SimpleDateFormat使用它,如果你不指定一个又一个,你无法成功解析英文abreviations,如ThuFeb

但是,您可以指定使用ENGLISHLocale这样的:

SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH); 
0

您已经运行到Java中的现在过时Date类的许多疾病之一。

声音和简单的修复是转换到Java 8日期和时间类。与Date最相符的新课程是Instant。有了这个类代码变为:

Instant now = Instant.now(); 

    String dateString = now.toString(); 
    System.out.println(" 1. " + dateString); 

    try { 
     Instant parsed = Instant.parse(dateString); 
     System.out.println(" 2. " + parsed.toString()); 
    } catch (DateTimeParseException e) { 
     System.out.println("ERROR: Cannot parse \"" + dateString + "\""); 
    } 

我从你的榜样冷落3.。当然,可以用任何你可以想象的方式来设置Instant的格式,但是如果我们只想要与toString方法相同的输出,那么现在我觉得它不值得。相反,我想表明,对于这种情况,你根本不需要格式。该代码打印:

1. 2017-02-23T17:07:19.775Z 
2. 2017-02-23T17:07:19.775Z 

您会注意到它打印在UTC时间。如果您想要改为本地时区,只需使用ZonedDateTime而不是Instant。代码的其余部分是完全一样的,但现在我的电脑上输出是:

1. 2017-02-23T18:07:19.852+01:00[Europe/Berlin] 
2. 2017-02-23T18:07:19.852+01:00[Europe/Berlin] 

当然有可能产生像你还不服的语言环境中的新类得到一个错误。据我所见,你将不得不明确指定不同意的地区。所以你不会轻易做到这一点。