Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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 为什么今天格式化’;安卓工作室的日期是19700101?_Java_Android_Date_Calendar_Simpledateformat - Fatal编程技术网

Java 为什么今天格式化’;安卓工作室的日期是19700101?

Java 为什么今天格式化’;安卓工作室的日期是19700101?,java,android,date,calendar,simpledateformat,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 G

这是我的密码:

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);
import java.util.Date;
导入java.text.simpleDataFormat;
导入java.util.GregorianCalendar;
导入java.util.Calendar;
公共类MainActivity扩展了AppCompatActivity{
公共静态void main(字符串[]args){
Calendar cal=新的Gregorianalendar();
日期日期=新日期(System.currentTimeMillis());
校准设定时间(日期);
如果(日历分钟<40){
如果(日历时数=0){
cal.add(日历日/月日,-1);
校准设置(日历小时/天,23);
}
其他的
计算添加(日历小时/天,-1);
}
int z=cal.get(日历日期,每月的第天);
int w=cal.get(日历小时);
SimpleDataFormat sdf_nowbasedate=新的SimpleDataFormat(“yyyyMMdd”);
SimpleDataFormat sdf_nowbasetime=新SimpleDataFormat(“HH”);
字符串baseDate\u now=sdf\u nowbasedate.format(z);
字符串baseTime\u now=sdf\u nowbasetime.format(w)+“00”;
System.out.println(baseDate\u now+“”+baseTime\u 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日)晚几十毫秒


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

您必须将
日期传递到
sdf\u nowbasedate。格式(日期)
而不是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);
DateTimeFormatter formatter=DateTimeFormatter.of模式(“uuummdd HHmm”);
ZonedDateTime zdt=ZonedDateTime.now(亚洲/首尔地区);
if(zdt.getMinute()<40){
zdt=zdt.小时数(1);
}
ZonedDateTime wholeHours=zdt.truncatedTo(ChronoUnit.HOURS);
字符串baseNow=wholeHours.format(格式化程序);
System.out.println(baseNow);
刚刚运行这个(韩国00:52),它打印了:

20180607 0000

我使用的是
java.time
,现代java日期和时间API,因为
Calendar
gregoriacalendar
date
SimpleDateFormat
都早已过时,设计拙劣,而且
java.time
更适合使用

您的代码中似乎存在另一个错误。
Calendar.MINUTE
Calendar.HOUR\u OF_DAY
是值为12和11的常量,因此
Calendar.MINUTE<40
将始终为真,而
Calendar.HOUR\u OF_OF_DAY==0
将永远不会为真。相反,您可能希望
Calendar.MINUTE
一天中的几个小时也是如此。要吸取的教训是:对于旧类,很容易出错,有些错误会被忽略,有些错误很难确定。我建议您避免使用这些类

问题:我可以在Android上使用java.time吗? 是的,
java.time
在较旧和较新的Android设备上运行良好。它至少需要java6

  • 在Java8和更高版本以及更新的Android设备上(我听说是API级别26),现代API是内置的
  • 在Java6和Java7中,获取三个后端口,即新类的后端口(三个用于JSR310;请参阅底部的链接)
  • 在(较旧的)Android上,使用Android版的ThreeTen Backport。它被称为ThreeTenABP。并确保您使用子包从
    org.ThreeTen.bp
    导入日期和时间类
链接
  • 解释如何使用
    java.time
  • ,其中首先描述了
    java.time
  • ,java.time的后端口
到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

  • 你调试过if-else条件吗?我建议你避免使用
    SimpleDateFormat
    类。它不仅过时很久,而且非常麻烦。
    Date
    Calendar
    也过时了。今天我们有了更好的。顺便说一句,假设你的代码没有问题总是很危险的。F由于
    java.text.DateFormat
    /
    java.text.format
    超类中有
    format(Object)
    ,因此它可以编译并生成此结果,该超类从历元值开始将任何
    数字
    作为毫秒。