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

时间:2018-06-06 04:13:22

标签: java android date calendar simpledateformat

这是我的代码:

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”

为什么会发生此错误?

3 个答案:

答案 0 :(得分:1)

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日。

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

答案 1 :(得分:0)

您必须将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";

答案 2 :(得分:0)

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日期和时间API java.time,因为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,新类的后端端口(适用于JSR 310的ThreeTen;请参阅底部的链接)。
  • On(较旧)Android使用Android版的ThreeTen Backport。它被称为ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类。

链接