Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 生成昨天的字符串’;s ISO 8601格式的日期时间_Java_Android_Date_Calendar_Simpledateformat - Fatal编程技术网

Java 生成昨天的字符串’;s ISO 8601格式的日期时间

Java 生成昨天的字符串’;s ISO 8601格式的日期时间,java,android,date,calendar,simpledateformat,Java,Android,Date,Calendar,Simpledateformat,在Android中,我使用java.util.Calendar以yyyy-MM-dd'T'hh:MM:ss'Z'格式获取昨天的日期。例如,如果今天是2017年5月31日,我想将昨天的日期设置为2017-05-30T00:00:00Z Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Cal

在Android中,我使用
java.util.Calendar
yyyy-MM-dd'T'hh:MM:ss'Z'格式获取昨天的日期。例如,如果今天是2017年5月31日,我想将昨天的日期设置为2017-05-30T00:00:00Z

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);

// Date End = yesterday
calendar.add(Calendar.DATE, -1);
Date dateEnd = calendar.getTime();

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss'Z'");
this.dateEndStr = formatter.format(dateEnd);
我希望输出为
2017-05-30T00:00:00Z
。但是它给了我
2017-05-30T12:00:00Z

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);

// Date End = yesterday
calendar.add(Calendar.DATE, -1);
Date dateEnd = calendar.getTime();

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss'Z'");
this.dateEndStr = formatter.format(dateEnd);

这里怎么了?它与时区有关吗?我的时区是
GMT/UTC+08:00小时

要减去天数,您应该使用:

Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, -5);

这只是您的
SimpleDataFormat
中的一个错误

您对小时使用
hh
,但这显示了基于一小时的AM/PM

这些是相关符号(来自)

  • H
    一天中的小时数(0-23)
  • k
    一天中的小时数(1-24)
  • K
    am/pm小时数(0-11)
  • h
    am/pm小时数(1-12)
你想要这个:
“yyyy-MM-dd'T'HH:MM:ss'Z'”

备注

你说你的时区是+08:00小时,你使用该时区计算日期,但是你将其格式化为Zulu时区(偏移量为+00:00)

奖金

在Java 8中,所有这些日历操作都消失了:

ZonedDateTime yesterday = ZonedDateTime.now().with(ChronoField.NANO_OF_DAY, 0).minusDays(1);
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
dateEndStr = formatter.format(dateEnd);

我的回答可能比你问的要多,但现在你问了,为什么不把所有的都拿走呢?我发现你的代码有两三处错误。bowmore in已经谈到了这三个问题,但我认为其中有几个问题可以说得更清楚一些:

  • 是的,第一个也是最严重的是与时区有关的。您需要决定并在代码中明确使用哪个时区。在时区偏移量+08:00的时间段上,将Z作为时区是不正确的。Z代表祖鲁时间,UTC的另一个名称
  • 在格式模式中,一天中的小时应该使用大写字母
    HH
  • 原则上,您应该更喜欢现代日期和时间类,但至少在这种情况下是这样的。有了这些,您将无法像使用老式的
    SimpleDataFormat
    时那样出错
  • 时区 时区对你的任务至关重要。您需要决定昨天的日期是UTC(如您请求的输出所示)、GMT/UTC+08:00还是JVM的当前时区(可以在程序运行时随时更改)。此代码段使用UTC:

    this.yesterdayAtStartOfDay = LocalDate.now(ZoneOffset.UTC)
        .minusDays(1)
        .atStartOfDay(ZoneOffset.UTC)
        .format(DateTimeFormatter.ISO_INSTANT);
    
    现在运行它,结果是

    2017-05-30T00:00:00Z
    
    您可以使用更简单的选项,而不是代码段的最后一行:

        .toString();
    
    这给出了相同的结果,因为
    atStartOfDay()
    给出了带有时区Z的
    ZonedDateTime
    ,其
    toString()
    方法给出了您请求的ISO 8601字符串

    如果您希望昨天的日期位于另一个时区,请在代码段的第一行(仅第一行)中使用例如
    ZoneOffset.ofHours(8)
    ZoneId.of(“亚洲/香港”)
    ZoneId.systemDefault()
    作为时区

    如果您使用的是Java6或Java7,请使用您需要获得的现代日期和时间类。尽管在引入外部依赖之前我总是三思而后行,但我还是热情地为您的任务推荐这个


    该后端端口在项目中进一步适用于Android

    打印日期结束。。。在将来,写一个标题,具体概括你问题的核心。这一次我是为你做的。仅供参考,像、
    java.text.SimpleTextFormat
    这样麻烦的旧日期时间类现在被这些类取代了。看,谢谢
    HH
    修复了我的问题:DIt显然是正确的,在区域偏移量+8的时间上,将Z指定为时区是不正确的。我也同意人们应该更喜欢Java8解决方案,它更清晰、更方便。所需的格式是ISO 8601,这是Java 8中的默认格式,因此您可以使用
    Instant.toString()
    DateTimeFormatter.ISO\u Instant
    ,这比构建自己的格式化程序更简单、更清晰。而且,如问题所示,更不容易出错。:-)另外,Java8Date和time类也已经被更新。你没有理由不喜欢他们来完成这项任务。