在Android中,我使用java.util.Calendar
以格式yyyy-MM-dd'T'hh:mm:ss'Z'
获取昨天的日期。例如,如果今天是31 May 2017
,我希望昨天的日期为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
。
这里有什么问题? TimeZone是否相关?我的时区是GMT/UTC + 08:00 hour
。
答案 0 :(得分:4)
我可能回答的问题比您提出的要多,但现在您已经问过,为什么不采取所有措施呢?我看到你的代码有两三个错误。 another answer中的bowmore已经触及了所有三个,但我认为其中的一些可以更清晰一些:
df_new
一小时。import pandas as pd
# 1. generate dataframes per group to get the boundary within `t0` and `tN` from df_s dataframe, where each dataframe has "group, obs, lifetime, status" columns X (tN - t0 / week) rows filled with 0 values.
df_all = pd.concat([df_group1, df_group2])
def do_that(R):
found_event_row = df_e.iloc[[R.group]]
# check if found_event_row['date'] falls into R['obs'] week
# if True, then found how long it's there
df_new = df_all.apply(do_that)
。时区对您的任务至关重要。您需要在HH
中,或者在JVM的当前时区(可以在程序运行时随时更改)中确定昨天的UTC日期(如您所请求的输出所示)。此代码段使用UTC:
SimpleDateFormat
刚才运行,结果是
GMT/UTC + 08:00
您可以使用更简单的代码:
,而不是代码段的最后一行this.yesterdayAtStartOfDay = LocalDate.now(ZoneOffset.UTC)
.minusDays(1)
.atStartOfDay(ZoneOffset.UTC)
.format(DateTimeFormatter.ISO_INSTANT);
这会得到相同的结果,因为2017-05-30T00:00:00Z
为 .toString();
提供了时区Z,其atStartOfDay()
方法提供了您请求的ISO 8601字符串。
如果您希望昨天的日期位于其他时区,则在代码段的第一行(并且只有第一行)使用例如ZonedDateTime
,toString()
或ZoneOffset.ofHours(8)
作为时区
如果您使用的是Java 6或7,要使用现代日期和时间类,您需要获取the ThreeTen-Backport library。尽管在引入外部依赖之前我总是三思而后行,但我还是热情地推荐这一点。
该后端端口在ThreeTenABP项目中进一步适用于Android。
答案 1 :(得分:3)
这只是您SimpleDateFormat
中的一个错误。
您使用hh
表示小时数,但会显示上午/下午的一小时。
这些是相关符号(来自SimpleDateFormat
)
H
小时(0-23)k
小时(1-24)K
上午/下午(0-11)小时h
上午/下午(1-12)小时你想要这个:"yyyy-MM-dd'T'HH:mm:ss'Z'"
<强> 备注 强>
您说您的时区是+08:00小时,并且您使用该时区计算日期,但是您将其格式化为好像它在Zulu时区(偏移量为+00:00)< / p>
<强> 奖金 强>
在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);
答案 2 :(得分:0)
要减去天数,您应该使用:
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, -5);
答案 3 :(得分:0)
cal.add(Calendar.DAY_OF_YEAR, -1);