Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.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 简单日期格式分析日期时出错_Java_Android_Datetime_Simpledateformat - Fatal编程技术网

Java 简单日期格式分析日期时出错

Java 简单日期格式分析日期时出错,java,android,datetime,simpledateformat,Java,Android,Datetime,Simpledateformat,我有一个简单的日期格式的问题,我不知道为什么。 这是我的算法 if (realtimeDeparture != null) { int hours = this.realtimeDeparture / 3600; int minutes = (this.realtimeDeparture % 3600) / 60; SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm");

我有一个简单的日期格式的问题,我不知道为什么。 这是我的算法

if (realtimeDeparture != null) {
        int hours = this.realtimeDeparture / 3600;
        int minutes = (this.realtimeDeparture % 3600) / 60;
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm");
        try {
            Calendar cal = Calendar.getInstance(Locale.FRENCH);
            String date = cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH)+1)+ "-" + cal.get(Calendar.DAY_OF_MONTH)+ " " + hours+":"+minutes;
            result = df.parse(date);
}
我有一个API,它在00h00(实时离开)后给我一个秒数 我想从这个整数中提取一个真实的日期对象 所以我做了这个算法,但我不知道为什么

例如,有一些输入和结果值:

date = 2018-5-7 12:26
result = Mon May 07 00:26:00 GMT+02:00 2018
我试图检查2018年5月7日是否与2018年5月7日不同,但问题相同:

date = 2018-05-07 12:26 
result = Mon May 07 00:26:00 GMT+02:00 2018
如何从00h00的秒数中获取日期对象? 或者如何修复我的算法?

试试这段代码

   String date=" 2018-5-7 12:26";
    SimpleDateFormat spf=new SimpleDateFormat("yyyy-mm-dd hh:mm");
    Date newDate= null;
    try {
        newDate = spf.parse(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    spf= new SimpleDateFormat("EEE MMM dd hh:mm:ss zzz yyyy", Locale.ENGLISH);
    date = spf.format(newDate);
    System.out.println(date);
然后对象要转换,如下面的代码所示

        try {
        Date dateToshow=spf.parse(date);
        Log.d("Date object:",dateToshow.toString());
    } catch (ParseException e) {
        e.printStackTrace();
    }
请尝试此代码

   String date=" 2018-5-7 12:26";
    SimpleDateFormat spf=new SimpleDateFormat("yyyy-mm-dd hh:mm");
    Date newDate= null;
    try {
        newDate = spf.parse(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    spf= new SimpleDateFormat("EEE MMM dd hh:mm:ss zzz yyyy", Locale.ENGLISH);
    date = spf.format(newDate);
    System.out.println(date);
然后对象要转换,如下面的代码所示

        try {
        Date dateToshow=spf.parse(date);
        Log.d("Date object:",dateToshow.toString());
    } catch (ParseException e) {
        e.printStackTrace();
    }

我觉得你的计算很好,所以我猜问题在于格式

你试过使用吗

cal.set(Calendar.HOUR_OF_DAY, hours);
cal.set(Calendar.MINUTE, minutes);
然后和她约会

Date date = cal.getTime();

我觉得你的计算很好,所以我猜问题在于格式

你试过使用吗

cal.set(Calendar.HOUR_OF_DAY, hours);
cal.set(Calendar.MINUTE, minutes);
然后和她约会

Date date = cal.getTime();

使用java.time,这是一种现代java日期和时间API,它更简单、更直接、更不容易出错:

    int realtimeDeparture = 44783;
    LocalTime time = LocalTime.ofSecondOfDay(realtimeDeparture);
    System.out.println(time);
这张照片是:

12:26:23

如果您需要一天中某个时间的今天日期,则需要首先确定时区,例如:

    ZoneId zone = ZoneId.of("Asia/Bangkok");
    ZonedDateTime dateTime = LocalDate.now(zone).atTime(time).atZone(zone);
    System.out.println(dateTime);
2018-05-07T12:26:23+07:00[亚洲/曼谷]

问题:为什么我需要时区?因为地球上任何地方的日期都不一样。您可以指定
ZoneId.systemDefault()
以使用JVM的时区设置,而时区设置通常来自设备。但是,它可以随时从程序的另一部分或运行在同一JVM中的另一个程序进行更改

你的代码出了什么问题? 在您的格式模式字符串中,您使用小写字母
hh
数小时,在您的示例中为12小时
hh
表示从01到12的上午或下午的小时数。当您不指定AM或PM时,
SimpleDataFormat
使用AM作为默认值。上午12:26表示午夜后26分钟,与24小时制的00:26相同。这就是
SimpleDateFormat
给你的

你有点幸运,每天12小时进行测试。一天中的其他几个小时的工作,正如你所期望的,尽管你有bug。其他人也犯了同样的错误,而且很长时间都没有被注意到。作为比较,现代API在类似情况下会抛出一个异常,让您知道丢失的AM/PM标记。我显然更喜欢这种行为

问题:我可以在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
  • ,解释得非常透彻

使用java.time,这是一种现代java日期和时间API,它更简单、更直接、更不容易出错:

    int realtimeDeparture = 44783;
    LocalTime time = LocalTime.ofSecondOfDay(realtimeDeparture);
    System.out.println(time);
这张照片是:

12:26:23

如果您需要一天中某个时间的今天日期,则需要首先确定时区,例如:

    ZoneId zone = ZoneId.of("Asia/Bangkok");
    ZonedDateTime dateTime = LocalDate.now(zone).atTime(time).atZone(zone);
    System.out.println(dateTime);
2018-05-07T12:26:23+07:00[亚洲/曼谷]

问题:为什么我需要时区?因为地球上任何地方的日期都不一样。您可以指定
ZoneId.systemDefault()
以使用JVM的时区设置,而时区设置通常来自设备。但是,它可以随时从程序的另一部分或运行在同一JVM中的另一个程序进行更改

你的代码出了什么问题? 在您的格式模式字符串中,您使用小写字母
hh
数小时,在您的示例中为12小时
hh
表示从01到12的上午或下午的小时数。当您不指定AM或PM时,
SimpleDataFormat
使用AM作为默认值。上午12:26表示午夜后26分钟,与24小时制的00:26相同。这就是
SimpleDateFormat
给你的

你有点幸运,每天12小时进行测试。一天中的其他几个小时的工作,正如你所期望的,尽管你有bug。其他人也犯了同样的错误,而且很长时间都没有被注意到。作为比较,现代API在类似情况下会抛出一个异常,让您知道丢失的AM/PM标记。我显然更喜欢这种行为

问题:我可以在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
  • ,解释得非常透彻

服务器si的实际值是多少