有 Java 编程相关的问题?

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

java是否将日历设置为特定日期?

我想在特定日期设置通知提醒。然后,我目前正在将AlarmManager与NotificationManager一起使用。当我从dateDialog设置所选日期时,提醒正在工作。如何将日历值设置为固定时间的闹钟?我从以下位置获取当前日期和时间:

Calendar calendar =  Calendar.getInstance();

然后,我可以手动设置日历,如下所示,日历正常工作:

calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 13);
calendar.set(Calendar.HOUR, 7);
calendar.set(Calendar.AM_PM, Calendar.AM);
calendar.set(Calendar.MONTH, Calendar.JANUARY);
calendar.set(Calendar.DAY_OF_MONTH, 8);
calendar.set(Calendar.YEAR,2015);
long when = calendar.getTimeInMillis();

但我的问题是,如何将日历设置为明天和上午9:00,或将日历精确设置为当前日期之后的某个月(或年份)?我的意思是这样的:

calendar.add(Calendar.DAY_OF_MONTH, 1);

但它不起作用


共 (4) 个答案

  1. # 1 楼答案

    乔达时间

    更新:项目Joda-Time现在位于maintenance mode,团队建议迁移到java.time类。见Tutorial by Oracle

    尝试使用更好的日期时间库,例如Joda time

    在Joda Time中,您可以更改日期,同时保留一天中的时间。或者,反之亦然,在保留日期的同时保留一天中的时间

    DateTime now = DateTime.now( DateTimeZone.forID( "America/Montreal" ) ) ;
    DateTime todayNoon = now.withTime( 12, 0, 0, 0 ) ;
    DateTime midMarchSameYearSameTimeAsNow = now.withDate(  now.getYear(), DateTimeConstants.MARCH, 15 );
    DateTime tomorrowSameTime = now.plusDays( 1 );
    
  2. # 2 楼答案

    对我来说,这在桌面上运行很好,无法在Android上测试。
    更新:刚刚用AIDE在我的Android手机上测试了这个,得到了完全相同的结果

    import java.util.Calendar;
    
    public class CalendarTest {
    
        public static void main(String[] args) {
    
            Calendar calendar = Calendar.getInstance();
    
            System.out.println(calendar.getTimeInMillis() + " -> " + calendar.getTime());
    
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MINUTE, 13);
            calendar.set(Calendar.HOUR, 7);
            calendar.set(Calendar.AM_PM, Calendar.AM);
            calendar.set(Calendar.MONTH, Calendar.JANUARY);
            calendar.set(Calendar.DAY_OF_MONTH, 9);
            calendar.set(Calendar.YEAR, 2015);
    
            System.out.println(calendar.getTimeInMillis() + " -> " + calendar.getTime());
    
            calendar.add(Calendar.DAY_OF_MONTH, 1);
            calendar.add(Calendar.YEAR, 1);
    
            System.out.println(calendar.getTimeInMillis() + " -> " + calendar.getTime());
        }
    

    对于本测试,我的输出正是您所期望的:

    1420705649927 -> Thu Jan 08 09:27:29 CET 2015
    1420783980927 -> Fri Jan 09 07:13:00 CET 2015
    1452406380927 -> Sun Jan 10 07:13:00 CET 2016
    
  3. # 3 楼答案

    tl;博士

    ZonedDateTime.of(
        LocalDate.of( 2015 , Month.JANUARY , 8 ) ,
        LocalTime.of( 7 , 13 , 0 ) ,
        ZoneId.of( "Africa/Tunis" ) 
    )
    .toInstant()
    .toEpochMilli()
    

    1420697580000

    爪哇。时间

    现代方法使用java。时间类取代了麻烦的旧遗留日期时间类<所以现在更容易更干净了

    你的代码模棱两可,因为你没有解决时区的关键问题。由于没有明确指定时区,JVM的当前默认时区将被隐式应用。我强烈建议始终指定您想要/期望的时区

    continent/region的格式指定一个proper time zone name,例如^{}^{}Pacific/Auckland。千万不要使用3-4个字母的伪时区,比如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)

    LocalDate ld = LocalDate.of( 2015 , Month.JANUARY , 8 ) ;
    LocalTime lt = LocalTime.of( 7 , 13 , 0 ) ;
    ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
    ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
    

    你也可以使用组合因子法

    ZonedDateTime zdt = ZonedDateTime.of( 2015 , Month.JANUARY , 8 , 7 , 13 , 0 , 0 , ZoneId.of( "Pacific/Auckland" ) ) ;
    

    我通常不建议从epoch开始计算日期时间。但这似乎是你的要求

    首先,我们可以提取一个Instant,UTC中的一个时刻。^{}类表示UTC中时间轴上的一个时刻,分辨率为nanoseconds(最多九(9)位小数)

    Instant instant = zdt.toInstant() ;  // Convert from a zoned value to a UTC value.
    

    然后,您可以在UTC 1970-01-01T00:00:00Z中询问自1970年第一个时刻的历元参考以来的毫秒计数。当心可能的数据丢失,因为Instant中的任何微秒或纳秒在报告毫秒时都将被忽略

    long millis = instant.toEpochMilli() ;  // Count of milliseconds since 1970-01-01T00:00:00Z.
    

    关于java。时间

    java.time框架内置于Java8及更高版本中。这些类取代了legacy日期时间类,比如^{}^{}、&^{}

    现在位于maintenance modeJoda-Time项目建议迁移到java.time

    要了解更多信息,请参阅Oracle Tutorial。并在Stack Overflow中搜索许多示例和解释。规格是JSR 310

    使用与JDBC 4.2或更高版本兼容的JDBC driver,您可以交换java。时间对象直接与数据库连接。不需要字符串或java。sql.*上课

    在哪里可以获得java。时间课

    ThreeTen-Extra项目扩展了java。有额外课程的时间。这个项目是java未来可能增加的一个试验场。时间你可以在这里找到一些有用的类,比如^{}^{}^{}more

  4. # 4 楼答案

    要通过示例添加一小时,可以执行以下操作:

    calendar.set(Calendar.HOUR, calendar.get(Calendar.HOUR) + 1);