代码之家  ›  专栏  ›  技术社区  ›  Buddhika Lakshan

如何将此日期“2018-08-02t00:00+05:30”字符串格式化为此“2018-18-02”

  •  0
  • Buddhika Lakshan  · 技术社区  · 6 年前
    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"));
        }
    
    }
    
    4 回复  |  直到 6 年前
        1
  •  3
  •   ernest_k Petronella    6 年前

    你可以用 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);
    

    并且返回相同的字符串。

        2
  •  2
  •   Anonymous    6 年前

    Java.时间

    public static String getDateUsingOracleFormat(String date) {
        OffsetDateTime dateTime = OffsetDateTime.parse(date);
        String outputText = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE);
        return outputText;
    }
    

    使用此方法声明 main 印刷品:

    2018年8月2日

    两种格式(您正在解析的格式和正在生成的格式)都符合iso 8601(底部的链接)。JavaTimes,现代Java日期和时间API的类,将该格式解析并打印为默认格式,即使用任何显式格式化程序。另外,这些数据表是内置的,所以我使用一个来指定我们希望没有日期的日期格式和UTC的偏移量。不需要编写自己的格式化程序这一容易出错的任务。

    你的密码出了什么问题?

    正如其他人所说的,您的格式模式字符串与解析100%的日期时间字符串不匹配。格式要求在那几秒钟之后应该有一个点和一些毫秒。相反,字符串有一个偏移量, +05:30 . 这会导致异常。相比之下 OffsetDateTime.parse 接受带毫秒和不带毫秒的字符串(因为它们在ISO8601中是可选的)(但需要偏移量)。

    代码中还有一个bug:使用大写 YYY 在要格式化到的格式模式中。这会偶尔给你带来错误的一年。小写字母 y 是时代的一年。大写 Y 是一周一年,只对周数有用。

    另外,由于您的方法是静态的,所以不需要创建一个实例来调用它。只要做:

        System.out.println(Kf_Date.getDateUsingOracleFormat("2018-08-02T00:00:00+05:30"));
    

    链接

        3
  •  1
  •   1218985    6 年前

    您可以这样使用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"));
        }
    
    }
    
        4
  •  1
  •   Oleg Cherednik    6 年前

    除了这一行之外,您有正确的代码。使用 XXX公司 而不是 .S.公司 在输入模式中:

    DateFormat inputFormat = new SimpleDateFormat("yyy-MM-dd'T'HH:mm:ssXXX");
    

    根据 Class SimpleDateFormat :

    • -时区,ISO 8601时区 (-08;-0080;-08:-00)
    • S公司 -毫秒,数字 (978年)

    提示:

    如果您在解析日期字符串时遇到问题,并且不知道模式中的错误,那么只需打印当前日期并将其与输入字符串进行比较。然后您可以看到差异并修复模式:

    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