代码之家  ›  专栏  ›  技术社区  ›  Vladimir Prudnikov

日期“2013年1月2日星期三下午5:29:26+02:00”的Java日期格式字符串

  •  0
  • Vladimir Prudnikov  · 技术社区  · 11 年前

    我正在将一些数据导入某个系统,它要求我为CSV文档中的日期提供一个java日期格式字符串。我不是Java程序员,我很难测试它。它要求使用对 SimpleDateFormat .

    我有这样的约会 Wednesday, January 2, 2013 5:29:26 PM +02:00 这是我根据文档提供的格式字符串,但它失败了:

    EEEE, MMM d, y hh:mm:ss a Z
    

    我认为时区格式字符串是错误的,但我不知道正确的解决方案。请帮忙。

    4 回复  |  直到 11 年前
        1
  •  2
  •   MadProgrammer    11 年前

    问题是+02:00,Java需要+0200。如果你能纠正这一点,它将正确解析

        2
  •  0
  •   Martin V.    11 年前

    以Joda Time库为例,它内置了对解析和输出ISO格式日期字符串的支持。

        3
  •  0
  •   Tom Carchrae    11 年前

    要调试日期分析错误,请打印出日期格式。

    如:

    System.out.println(new SimpleDateFormat("EEEE, MMM d, y hh:mm:ss a Z").format(new Date()));
    

    然后进行调整,直到您看到正确的格式。

    希望能有所帮助

        4
  •  0
  •   Cebence    11 年前

    希望你的问题的答案是:

    C:\Users\Cebence\jdev\StackOverflow> java StackOverflow15914753
    input = Wednesday, January 2, 2013 5:29:26 PM +02:00
    
    Parsing input into date ............   [ OK ]
    
        date @ local = Wed Jan 02 16:29:26 CET 2013
    ISO date @ local = 2013-01-02T16:29:26.000+01:00
            UTC date = 2013-01-02T15:29:26.000Z
    

    此输出是由以下演示应用程序创建的。 注意 正确的时区、区域设置和“X”而不是“Z” 用于解析。 “X”处理“+02:00”,并且只能在Java 7上工作。

        // Important to be US!
        SimpleDateFormat format = new SimpleDateFormat(CUSTOM_FORMAT_WITH_TZ, Locale.US);
        // Important to be +2 hours offset!
    
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Locale;
    import java.util.TimeZone;
    
    
    /**
     * http://stackoverflow.com/questions/15914753/java-date-format-string-for-date-wednesday-january-2-2013-52926-pm-0200
     * input: "Wednesday, January 2, 2013 5:29:26 PM +02:00"
     * asking-for: working timestamp format string "EEEE, MMM d, y hh:mm:ss a Z"
     *
     * @author dejan.cebetarevic
     */
    public class StackOverflow15914753 {
      private static final String ISO_FORMAT_WITH_TZ = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
      private static final String ISO_FORMAT_NO_TZ = "yyyy-MM-dd'T'HH:mm:ss.SSS";
      private static final String CUSTOM_FORMAT_WITH_TZ = "EEEE, MMMM d, y hh:mm:ss a XXX";
      private static final String DEFAULT_INPUT = "Wednesday, January 2, 2013 5:29:26 PM +02:00";
    
      public static void main(String[] args) throws Exception {
        // Assume default input.
        String input = DEFAULT_INPUT;
    
        // But if an input was given, use it.
        if (args.length == 1) {
          input = args[0];
        }
        System.out.println("input = " + input);
    
        System.out.print("\nParsing input into date ............");
        Date d = createCustomDateFormat().parse(input);
        System.out.println("   [ OK ]\n");
    
        System.out.println("    date @ local = " + d);
        System.out.println("ISO date @ local = " + isoFormat(d));
        System.out.println("        UTC date = " + utcFormat(d));
      }
    
      public static String utcFormat(Date date) throws Exception {
        SimpleDateFormat utc = new SimpleDateFormat(ISO_FORMAT_WITH_TZ, Locale.UK);
        utc.setCalendar(Calendar.getInstance(TimeZone.getTimeZone("UTC")));
        return utc.format(date);
      }
    
      public static String isoFormat(Date date) throws Exception {
        SimpleDateFormat iso = new SimpleDateFormat(ISO_FORMAT_WITH_TZ);
        return iso.format(date);
      }
    
      public static SimpleDateFormat createCustomDateFormat() throws Exception {
        // Important to be US!
        SimpleDateFormat format = new SimpleDateFormat(CUSTOM_FORMAT_WITH_TZ, Locale.US);
        // Important to be +2 hours offset!
        format.setCalendar(Calendar.getInstance(TimeZone.getTimeZone("GMT+2")));
        return format;
      }
    }