代码之家  ›  专栏  ›  技术社区  ›  StarWind0

Java日历添加随机毫秒数?

  •  3
  • StarWind0  · 技术社区  · 9 年前

    嗨,我有点奇怪的事发生了。我只是简单地获取一个日历对象,将其转换为其各个部分,然后将其放回日历中(无论是否有任何更改。在这种情况下,我不做任何更改)。我的意思是,这应该是剪切粘贴的。我还尝试使用calendar=calendar创建日历。getInstance()并手动设置所有内容。calendar.set(calendar.YEAR,mStartYear);等等。仍然提供错误的日历对象。我也尝试过设置毫秒,似乎总是有一些垃圾毫秒……但这种或那种方式的时间已经完全消失了。也许有人看到了愚蠢的疏忽,但我被难住了。

    这也是一个android应用程序,但对于一个基本的Java库对象来说并不重要。

    注意Weekview是我正在使用的一个库的数据包装器。它有一个开始和结束日历。

    以下是调试器在内存中列出的内容。。

    mEndDay = 19
    mEndHour = 9
    
    mEndMinute = 30
    mEndMonth = 8
    mEndYear = 2015
    mSeekAmount = 0
    mStartDay = 18
    mStartHour = 23
    mStartMinute = 0
    mStartMonth = 8
    mStartYear = 2015
    
    
                Calendar calendarStart = Calendar.getInstance();
                calendarStart.set(mStartYear,mStartMonth,mStartDay,mStartHour,mStartMinute);
    
                Calendar calendarEnd = Calendar.getInstance();
                calendarEnd.set(mEndYear,mEndMonth,mEndDay,mEndHour,mEndMinute);
    

    我最终得到了

    Start 1442363359161
    End 1442363359161
    
    calendarStart = {GregorianCalendar@20968} "java.util.GregorianCalendar[time=?,areFieldsSet=false,lenient=true,zone=America/Denver,firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2015,MONTH=8,WEEK_OF_YEAR=38,WEEK_OF_MONTH=3,DAY_OF_MONTH=18,DAY_OF_YEAR=258,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=6,HOUR_OF_DAY=23,MINUTE=0,SECOND=19,MILLISECOND=161,ZONE_OFFSET=-25200000,DST_OFFSET=3600000]"
    calendarEnd = {GregorianCalendar@20969} "java.util.GregorianCalendar[time=?,areFieldsSet=false,lenient=true,zone=America/Denver,firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2015,MONTH=8,WEEK_OF_YEAR=38,WEEK_OF_MONTH=3,DAY_OF_MONTH=19,DAY_OF_YEAR=258,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=6,HOUR_OF_DAY=9,MINUTE=30,SECOND=19,MILLISECOND=161,ZONE_OFFSET=-25200000,DST_OFFSET=3600000]"
    

    期望

    Start 1442638800000
    End 1442676600000
    
    mEndTime = {GregorianCalendar@20990} "java.util.GregorianCalendar[time=1442676600000,areFieldsSet=true,lenient=true,zone=America/Denver,firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2015,MONTH=8,WEEK_OF_YEAR=38,WEEK_OF_MONTH=3,DAY_OF_MONTH=19,DAY_OF_YEAR=262,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=3,AM_PM=0,HOUR=9,HOUR_OF_DAY=9,MINUTE=30,SECOND=0,MILLISECOND=0,ZONE_OFFSET=-25200000,DST_OFFSET=3600000]"
    mName = {String@20991} "sleep"
    mStartTime = {GregorianCalendar@20992} "java.util.GregorianCalendar[time=1442638800000,areFieldsSet=true,lenient=true,zone=America/Denver,firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2015,MONTH=8,WEEK_OF_YEAR=38,WEEK_OF_MONTH=3,DAY_OF_MONTH=18,DAY_OF_YEAR=261,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=11,HOUR_OF_DAY=23,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=-25200000,DST_OFFSET=3600000]"
    

    这是我最初设置的地方。。

       WeekViewEvent weekViewEvent = dateWrapperParam.getWeekViewEvent();
        Calendar endCalendar = weekViewEvent.getEndTime();
        Calendar startCalendar = weekViewEvent.getStartTime();
    
        Date endDate = endCalendar.getTime();
        Date startDate = startCalendar.getTime();
    
        mStartHour = startCalendar.get(Calendar.HOUR_OF_DAY);
        mStartMinute = startCalendar.get(Calendar.MINUTE);
        mStartDay = startCalendar.get(Calendar.DAY_OF_MONTH);
        mStartMonth = startCalendar.get(Calendar.MONTH);
        mStartYear = startCalendar.get(Calendar.YEAR);
    
        mEndHour = endCalendar.get(Calendar.HOUR_OF_DAY);
        mEndMinute = endCalendar.get(Calendar.MINUTE);
        mEndDay = endCalendar.get(Calendar.DAY_OF_MONTH);
        mEndMonth = endCalendar.get(Calendar.MONTH);
        mEndYear = endCalendar.get(Calendar.YEAR);
    
    4 回复  |  直到 4 年前
        1
  •  1
  •   AxelH    6 年前

    在以下文件中 Calendar.set ,据说:

    设置字段YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE和SECOND的值。保留其他字段的先前值。如果不需要,请致电 clear() 第一

    原因是并非所有字段都使用此方法设置,在您的情况下 MILLISECOND 设置因此,它在创建实例时保留值。

    的呼叫 Calendar.clear

    未定义设置此日历的所有日历字段值和时间值(与大纪元的毫秒偏移量)。

    一个简单的例子:

        Calendar c = GregorianCalendar.getInstance();
        c.clear();
        c.set(2019, Calendar.NOVEMBER, 03, 16, 15, 03);
    
        System.out.println(c.getTime());
        System.out.println(c.getTimeInMillis());
    

    2019年11月3日星期日16:15:03 CET
    1572794103000

    毫秒未定义将为0

        2
  •  0
  •   MaxZoom    9 年前

    根据我对你问题的评论 startCalendar calendarStart 时间,因为这些值没有重置。

    看见 DEMO

        3
  •  0
  •   Anonymous    4 年前

    Java语言时间和ThreeTenABP

    我建议您使用java。time,现代Java日期和时间API,用于您的日期和时间工作。例如:

        ZonedDateTime start = ZonedDateTime.now(ZoneId.systemDefault());
        ZonedDateTime end = start;
        
        System.out.println("Start: " + start);
        System.out.println("End:   " + end);
    

    刚才在时区运行代码时的输出:

    Start: 2020-06-24T19:24:04.811+02:00[Europe/Copenhagen]
    End:   2020-06-24T19:24:04.811+02:00[Europe/Copenhagen]
    

    A. ZonedDateTime 是某个时区的日期和时间。这是我们最接近的现代等价物 GregorianCalendar (的子类 Calendar 你的代码给你的)。要使用哪个现代类会因更精确的需求而有所不同,因此有时您更喜欢使用例如 LocalDate , OffsetDateTime 甚至 LocalTime .

    要将值截断为整分钟(将秒和秒的分数设置为0):

        ZonedDateTime start = ZonedDateTime.now(ZoneId.systemDefault())
                .truncatedTo(ChronoUnit.MINUTES);
    
    Start: 2020-06-24T19:24+02:00[Europe/Copenhagen]
    

    区域日期时间 以及其他java类。时间提供了许多修改所获得值的方法。例如:

        ZonedDateTime end = start.plusDays(2).withHour(13);
    
    End:   2020-06-26T13:24+02:00[Europe/Copenhagen]
    

    如果要仅使用开始时间中的选定字段手动创建结束时间:

        ZonedDateTime end = ZonedDateTime.of(
                2021, start.getMonthValue(), start.getDayOfMonth(),
                start.getHour(), 30, 0, 0, start.getZone());
    
    End:   2021-06-24T19:30+02:00[Europe/Copenhagen]
    

    你的代码出了什么问题?

    部分答案已经在其他答案中: set 方法 日历 仅设置他们承诺设置的字段,并在可能的情况下保持其他字段不变。虽然这可能是从 set​(int field, int value) 方法,它通常会使用 set​(int year, int month, int date) 方法,甚至更多 set​(int year, int month, int date, int hourOfDay, int minute) set​(int year, int month, int date, int hourOfDay, int minute, int second) 。总体而言,尽管用意良好 日历 类及其子类的设计很差,令人困惑,使用起来很麻烦。这是我推荐java的主要原因。以上时间。

    答案的另一部分是 日历 宽大地计算其场。所以当你看到 日历 调用后调试器中的对象 设置 ,它将包含大量垃圾值。使命感 getTime() 强制 日历 计算其字段,因此在调用之后,它在调试器中的外观应该更有意义。同样,它令人困惑的行为,有时也可以在不使用调试器的情况下观察到。

    问题:不是java。时间要求Android API级别26?

    Java语言时间在较旧和较新的Android设备上都很好。它至少需要 Java 6 .

    • 在Java 8和更高版本以及更新的Android设备上(从API级别26开始),现代API是内置的。
    • 在非Android Java 6和7中,使用ThreeTen Backport,这是现代类的后端(JSR 310的ThreeTen;请参阅底部的链接)。
    • 在(旧版)Android上使用Android版本的ThreeTen Backport。它叫做ThreeTenABP。并确保从导入日期和时间类 org.threeten.bp 带有子包。

    链接

        4
  •  0
  •   XplicitVariable    4 年前

    初始化Calendar对象时,它将获取当前时间,包括当前秒和毫秒。提供的代码设置小时和分钟,但不设置秒和毫秒,使其与Calendar对象初始化时保持原样。 要将秒和纳秒设置为零,请使用:

    StartCalendar.set(Year, Month, DayofMonth, Hour, Minute, 0,0);