有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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) 个答案

  1. # 1 楼答案

    请注意日历类的设置部分,有些地方出错:

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

    refrence

  2. # 2 楼答案

    爪哇。时间

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

        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,因此如果愿意,可以安全地强制转换为该类型

    我现在使用的是{},即现代Java日期和时间API,而不是过时且设计拙劣的Calendar类。和你一起工作真是太好了

    问题:我可以使用java吗。Android上的时间

    是的,java.time在较旧和较新的Android设备上运行良好。它至少需要Java6

    • 在Java8和更高版本以及更新的Android设备上(我听说是API级别26),现代API是内置的
    • 在Java6和Java7中,获取三个后端口,即新类的后端口(三个用于JSR310;请参阅底部的链接)
    • 在(较旧的)Android上使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类

    链接

  3. # 3 楼答案

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

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

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