从一天开始以小时和分钟为单位的毫秒数

时间:2018-06-02 11:59:27

标签: 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.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时因为时区而有所帮助),有什么帮助吗?

3 个答案:

答案 0 :(得分:2)

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日期和时间API的长期过时且设计不佳的java.time类。与它合作非常好。

问题:我可以在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导入日期和时间类。

链接

答案 1 :(得分:0)

注意Calendar类的设置部分,那里有些错误:

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

refrence

答案 2 :(得分:0)

我认为问题是因为您试图将两个日期之间的差异视为日期。

如果以其他方式运行代码,则会正确显示差异:

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));

    }
}