如何以毫秒为单位获取当天的时间?

时间:2014-03-10 02:14:12

标签: java android date time milliseconds

我想以毫秒为单位获取一天的时间,我今天不会有任何具体日期,只是一次。我做了一些东西,认为它有效,但随后进行了调试并得出结论认为它不起作用我想要它。

我想用它来检查当前时间是否在指定的startTimeendTime之间。

    long startTime = settings.getLong("startTime", 0);
    long endTime = settings.getLong("endTime", 0);

    if ((currentTime.getMillis() >= startTime)
            && (currentTime.getMillis() <= endTime)) {
            //Do stuff here

 }

我如何设置职业的时间startTimeendTime

                        Calendar startTime = Calendar.getInstance();
                        startTime.set(Calendar.HOUR_OF_DAY, 16);
                        startTime.set(Calendar.MINUTE, 00);
                        editor.putLong("startTime",
                                startTime.getTimeInMillis());

                        Calendar endTime = Calendar.getInstance();
                        endTime.set(Calendar.HOUR_OF_DAY, 16);
                        endTime.set(Calendar.MINUTE, 00);
                        endTime.add(Calendar.HOUR_OF_DAY, 11);
                        editor.putLong("endTime",
                                endTime.getTimeInMillis());
                        editor.commit();

但是,这意味着startTimeendTime都会附加一个特定的日期。

我希望我解释得很好,感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

避免毫秒

无需为了您的目的而花费几毫秒的时间。使用毫秒作为日期时间会让人感到困惑和容易出错。

你需要的是一个体面的日期时间库,而不是臭名昭着的捆绑java.util.Date&amp; .Calendar类。

约达时间

如果您确定要忽略日期并忽略时区,请参阅第三方免费LocalTime库提供的Joda-Time类的示例代码。

LocalTime start = new LocalTime( 10, 0, 0 );
LocalTime stop = new LocalTime( 14, 30, 0 );
LocalTime target = LocalTime.now();
boolean isNowInSpan = !( ( target.isBefore( target ) ) | ( target.isAfter( stop ) ) );

根据您的业务逻辑需求调整最后一行。你可能想要:

  • 开头和结尾是包含
  • 开头和结尾是独占
  • 半开”,其中开头是包含性的,结尾是独家的(通常最适合日期工作)

转储到控制台...

System.out.println( "start: " + start );
System.out.println( "stop: " + stop );
System.out.println( "target: " + target );
System.out.println( "isNowInSpan: " + isNowInSpan );

跑步时......

start: 10:00:00.000
stop: 14:30:00.000
target: 23:49:37.779
isNowInSpan: false

另一个例子

时间通常不是正确的方式。当一个新的日期工作时,一个天真的程序员可能首先认为只有时间才能简化事情。相反,这个例子显示了如何全天候旋转会产生复杂性。从长远来看,使用 date + time + timeZone 通常是最好的方法。

LocalTime now = LocalTime.now();
LocalTime start = new LocalTime( 13, 0, 0, 0 );
LocalTime stop = start.plusHours( 11 );

System.out.println( "now: " + now );
System.out.println( "start: " + start );
System.out.println( "stop: " + stop );

if ( now.isAfter( start ) ) {
    System.out.println( "After start" );
}

if ( now.isBefore( stop ) ) {
    System.out.println( "Before stop" );
}

跑步时......

now: 14:00:32.496
start: 13:00:00.000
stop: 00:00:00.000
After start

java.time

Java 8带来了由java.time package定义的Joda-Time启发的新JSR 310

在java.time中,你会发现一个类似于Joda-Time的LocalTime类。

答案 1 :(得分:1)

没有日期的时间意味着更少。在Java时间戳中,它使用Unix UTC和01/01/1970上的时间戳0开始。所以,startTime / endTime.getTimeInMillis()告诉你与UTC不同的时间。这意味着你的午夜是你的基础,你的endTime.getTimeInMillis()将是偏移量。

  Calendar cal = Calendar.getInstance();
  // set to mid-night
  cal.set(Calendar.HOUR_OF_DAY, 0);
  cal.set(Calendar.MINUTE, 0);
  cal.set(Calendar.SECOND, 0);
  cal.set(Calendar.MILLISECOND, 0);
  long midnight = cal.getTimeInMillis();

  cal.set(Calendar.HOUR_OF_DAY, 16);
  cal.set(Calendar.MINUTE, 00);
  long startTime = cal.getTimeInMillis();
  editor.putLong("startTime", (startTime - midnight));

  cal.add(Calendar.HOUR_OF_DAY, 11);
  long endTime = cal.getTimeInMillis();
  editor.putLong("endTime", (endTime - midnight));
  editor.commit();

答案 2 :(得分:1)