为什么在 Android Studio 中格式化今天的日期会得到 19700101?

Why does formatting today’s date in Android Studio give 19700101?

这是我的代码:

import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;
import java.util.Calendar;

public class MainActivity extends AppCompatActivity {

public static void main(String[] args) {
    Calendar cal = new GregorianCalendar();
    Date date = new Date(System.currentTimeMillis());
    cal.setTime( date );
    if (Calendar.MINUTE < 40) {
        if (Calendar.HOUR_OF_DAY == 0) {
            cal.add(Calendar.DAY_OF_MONTH, -1);
            cal.set(Calendar.HOUR_OF_DAY, 23);
        }
        else
        cal.add(Calendar.HOUR_OF_DAY, -1);
    }
    int z = cal.get(Calendar.DAY_OF_MONTH);
    int w = cal.get(Calendar.HOUR_OF_DAY);
    SimpleDateFormat sdf_nowbasedate = new SimpleDateFormat("yyyyMMdd");
    SimpleDateFormat sdf_nowbasetime = new SimpleDateFormat("HH");

    String baseDate_now = sdf_nowbasedate.format(z);
    String baseTime_now = sdf_nowbasetime.format(w)+ "00";

System.out.println(baseDate_now + " " + baseTime_now);

我期望的结果是“20180606 1200”(因为现在写这篇文章的时间是 2018 年 6 月 6 日,1:12 下午(KST - 我住在韩国)

但结果是“19700101 0900”

为什么会出现这个错误?

int z = cal.get(Calendar.DAY_OF_MONTH);
int w = cal.get(Calendar.HOUR_OF_DAY);
SimpleDateFormat sdf_nowbasedate = new SimpleDateFormat("yyyyMMdd");
String baseDate_now = sdf_nowbasedate.format(z);    

首先,这段代码甚至无法编译。没有将整数作为参数的格式函数。这需要约会。但假设您实际上以某种方式从该数字中确定了一个日期 - 这将使您的日期基本上比纪元时间晚几十毫秒,即 1970 年 1 月 1 日。

相反,将日期直接传递给格式。

您必须将 Date 传递给 sdf_nowbasedate.format(Date) 而不是 int("z" 或 "w") 当您使用日历时,您必须获取日期

String baseDate_now = sdf_nowbasedate.format(cal.getTime());
String baseTime_now = sdf_nowbasetime.format(cal.getTime())+ "00";

java.time

其他答案已经正确解释了为什么您的代码给您的日期是 1970 年 1 月 1 日。我想提供代码的现代正确版本。我想你正在寻找这样的东西:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMdd HHmm");
    ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Asia/Seoul"));
    if (zdt.getMinute() < 40) {
        zdt = zdt.minusHours(1);
    }
    ZonedDateTime wholeHours = zdt.truncatedTo(ChronoUnit.HOURS);
    String baseNow = wholeHours.format(formatter);
    System.out.println(baseNow);

运行 刚才(韩国 00:52)它打印了:

20180607 0000

我正在使用 java.time,现代 Java 日期和时间 API,因为 CalendarGregorianCalendarDateSimpleDateFormat 早已过时且设计不佳,而 java.time 更易于使用。

您的代码中似乎还有一个错误。 Calendar.MINUTECalendar.HOUR_OF_DAY 是值为 12 和 11 的常量,因此 Calendar.MINUTE < 40 永远为真,而 Calendar.HOUR_OF_DAY == 0 永远不会。相反,您可能打算 cal.get(Calendar.MINUTE) 并且类似地用于一天中的小时。经验教训:使用旧的 类 很容易出错,有些错误会被忽视,有些则很难查明。我确实建议您避免使用那些 类.

问题:我可以在 Android 上使用 java.time 吗?

是的,java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在 Java 8 和更高版本以及较新的 Android 设备上(据我所知,来自 API 级别 26)现代 API 是内置的。
  • 在 Java 6 和 7 中获取 ThreeTen Backport,新 类 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 类。

链接