Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.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_Time - Fatal编程技术网

Java 从一天开始的小时和分钟(毫秒)

Java 从一天开始的小时和分钟(毫秒),java,android,time,Java,Android,Time,我试图解决这个错误的输出,但没有任何帮助: Calendar cal = Calendar.getInstance(); cal.setTimeZone( TimeZone.getDefault() ); long oraPrecisa = cal.getTimeInMillis(); Log.e( "" , "oraPrecisa: " + new DateFormat().format( "HH:mm", oraPrecisa ).toString() ); cal.set(

我试图解决这个错误的输出,但没有任何帮助:

Calendar cal = Calendar.getInstance();
cal.setTimeZone( TimeZone.getDefault() );
long oraPrecisa     =   cal.getTimeInMillis();
Log.e( "" , "oraPrecisa: " + new DateFormat().format( "HH:mm", oraPrecisa ).toString() );

cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND, 1 );

oraPrecisa  =   oraPrecisa - cal.getTimeInMillis();
Log.e( "" , "OraPrecisa 2: " + new DateFormat().format( "HH:mm", oraPrecisa ).toString() );
返回此输出:

OraPrecisa: 13:58
OraPrecisa 2: 14:58

我有一个小时的错误(由于我在GMT+1的时区,我猜),有什么帮助吗?

注意你的日历课程的设置部分,有点问题:

set(f,value)将日历字段f更改为value。此外,它还设置了一个内部成员变量,以指示日历字段f已更改。尽管日历字段f会立即更改,但在下一次调用get()、getTime()、getTimeInMillis()、add()或roll()之前,不会重新计算日历的时间值(以毫秒为单位)。因此,多次调用set()不会触发多次不必要的计算。使用set()更改日历字段后,其他日历字段也可能会更改,具体取决于日历字段、日历字段值和日历系统。此外,在重新计算日历字段后,get(f)不一定返回通过调用set方法设置的值。具体内容由具体的日历类决定


我认为问题在于你试图将两个日期之间的差异视为一个日期

如果以另一种方式运行代码,则会正确显示差异:

import java.util.Calendar;
import java.util.TimeZone;
import java.text.DateFormat;
public class HelloWorld{

     public static void main(String []args){
        Calendar cal = Calendar.getInstance();
        cal.setTimeZone( TimeZone.getDefault() );
        long oraPrecisa     =   cal.getTimeInMillis();


        cal.set( Calendar.HOUR_OF_DAY, 0 );
        cal.set( Calendar.MINUTE, 0 );
        cal.set( Calendar.SECOND, 0 );
        cal.set( Calendar.MILLISECOND, 1 );

        oraPrecisa  =   oraPrecisa - cal.getTimeInMillis();

        oraPrecisa = oraPrecisa / 1000; 
        int hh = (int)(oraPrecisa  / 60 / 60);
        int mm = (int) ( ( oraPrecisa - (hh * 60 * 60) ) / 60 );
        int ss = (int) (oraPrecisa - hh * 60 * 60 - mm * 60);

        System.out.println(String.format("Diff: %2d:%2d:%2d",hh,mm,ss));

    }
}
java.time 如果要将一天中的时间转换为毫秒:

    ZoneId zone = ZoneId.of("Europe/Rome");
    LocalTime timeOfDay = LocalTime.now(zone);
    long milliOfDay = TimeUnit.NANOSECONDS.toMillis(timeOfDay.toNanoOfDay());
    System.out.println(milliOfDay);
如果你问我从一天开始算起的毫秒数,我会照字面理解:

    ZonedDateTime now = ZonedDateTime.now(zone);
    ZonedDateTime startOfDay = now.toLocalDate().atStartOfDay(zone);
    Duration dur = Duration.between(startOfDay, now);
    long millisSinceStartOfDay = dur.toMillis();
    System.out.println(millisSinceStartOfDay);
当我刚才运行这两个片段时(意大利是15:18:28),它们都打印出来了

55108833

那有什么区别吗?到目前为止,在大多数情况下,上面的两个片段将打印相同的结果。但是,例如,如果在同一天早些时候转换到或转换到夏季时间(夏令时),则本地时间将不会反映从一天开始经过的时间,然后片段将给出不同的结果。所以你应该仔细选择你想要的

由于自午夜起的毫秒数永远不会溢出
int
,如果愿意,您可以安全地转换为该类型

我使用的不是早已过时且设计拙劣的
Calendar
java.time
,而是现代的java日期和时间API。和你一起工作真是太好了

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

你到底想做什么?我不明白。我也在GMT+1,为什么不直接使用第一个
oraPrecisa
?这可能是夏令时的问题吗?查看日历android文档,告诉我们为什么第一次对你来说不够?@Bitamirshafie因为我需要从一天开始的绝对时间(毫秒)为什么还要设置Calendar.millis秒?,首先设置三个,然后你可以在毫秒内得到它。这不是这里的问题(尽管这是一个让很多人困惑的事实)。询问者正在调用
getTimeInMillis()
,根据您的报价,这将触发以毫秒为单位重新计算日历的时间值,因此返回正确的值。