如何用Java保存iso8601日期?

如何用Java保存iso8601日期?,java,datetime,iso8601,Java,Datetime,Iso8601,我需要按以下格式保存当前的日期+7天: 20161107T12:00:00+0000 Calendar exDate1 = Calendar.getInstance(); exDate1.add(Calendar.DATE , 7); Date Date1 = exDate1.getTime(); SimpleDateFormat sdf = new SimpleDateFormat("YYYYMMDD"); String Date = sdf.format(Date1 + "T12:00:

我需要按以下格式保存当前的
日期
+7天:

20161107T12:00:00+0000 
Calendar exDate1 = Calendar.getInstance();
exDate1.add(Calendar.DATE , 7);
Date Date1 = exDate1.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("YYYYMMDD");
String Date = sdf.format(Date1 + "T12:00:00+0000");
其中,
“T”
后面的零件是固定的

我尝试了以下方法:

20161107T12:00:00+0000 
Calendar exDate1 = Calendar.getInstance();
exDate1.add(Calendar.DATE , 7);
Date Date1 = exDate1.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("YYYYMMDD");
String Date = sdf.format(Date1 + "T12:00:00+0000");

没有成功

使用此“yyyyMMdd”模式

    Calendar currentDate = Calendar.getInstance();
    currentDate.add(Calendar.DATE, 7);
    Date date = currentDate.getTime();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

    String formattedDate = sdf.format(date).concat("T12:00:00+0000");

使用此“yyyyMMdd”模式

    Calendar currentDate = Calendar.getInstance();
    currentDate.add(Calendar.DATE, 7);
    Date date = currentDate.getTime();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

    String formattedDate = sdf.format(date).concat("T12:00:00+0000");

另一种方法是在java-8中使用新的
java.time
-API:

String result =
    DateTimeFormatter.BASIC_ISO_DATE.format(
        LocalDate.now(ZoneOffset.UTC).plusDays(7)
    ) + "T12:00:00+0000";
System.out.println(result); // 20161114T12:00:00+0000 
因您选择时区偏移而更新:

您试图隐式使用系统时区来确定当前本地时间,但应用了UTC+0000的固定偏移量。这是一个不一致的组合。如果应用这样的零偏移量,则还应根据UTC+0000确定当前日期,而不是在系统时区(
ZoneId.systemDefault()

编辑@Nim的建议

或者-上面的字符串可能没有正确的偏移量:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd'T'HH:mm:ssZ");
String date = LocalDate.now().plusDays(7).atTime(12, 0).atZone(ZoneId.systemDefault()).format(formatter);
将产生以下结果:

20161114T12:00:00+0100


这可能不是你想要的。我还尝试避免使用没有任何参数的表达式
LocalDate.now()
,因为它隐藏了对系统时区的依赖关系。

另一种方法是在java-8中使用新的
java.time
-API:

String result =
    DateTimeFormatter.BASIC_ISO_DATE.format(
        LocalDate.now(ZoneOffset.UTC).plusDays(7)
    ) + "T12:00:00+0000";
System.out.println(result); // 20161114T12:00:00+0000 
因您选择时区偏移而更新:

您试图隐式使用系统时区来确定当前本地时间,但应用了UTC+0000的固定偏移量。这是一个不一致的组合。如果应用这样的零偏移量,则还应根据UTC+0000确定当前日期,而不是在系统时区(
ZoneId.systemDefault()

编辑@Nim的建议

或者-上面的字符串可能没有正确的偏移量:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd'T'HH:mm:ssZ");
String date = LocalDate.now().plusDays(7).atTime(12, 0).atZone(ZoneId.systemDefault()).format(formatter);
将产生以下结果:

20161114T12:00:00+0100


这可能不是你想要的。我还尝试避免使用没有任何参数的表达式
LocalDate.now()
,因为它隐藏了对系统时区的依赖关系。

请检查
String Date=sdf.format(Date1)+“T12:00:00+0000”。另外,请遵循Java命名约定-不要对变量使用大写名称请查看
String Date=sdf.format(Date1)+“T12:00:00+0000”。另外,请遵循Java命名约定-不要对变量使用大写名称