到目前为止,如何获得当天的总分钟数?

时间:2014-09-09 03:48:46

标签: java android date datetime android-calendar

到目前为止,如何获得Java(Android)中当天的总分钟数?这可能吗? 例如,如果是凌晨12:37,我希望它返回int 37(当天到目前为止37分钟)。或者如果它是凌晨1:41,我希望它返回int 101(当天到目前为止101分钟),或者如果它在下午12:20,它将返回int 740(当天总共740分钟)。

5 个答案:

答案 0 :(得分:9)

我实际上使用Calendar类来解决这个问题。

以下是代码,currentMinuteOfDay是总分钟数。

Calendar now = Calendar.getInstance();
        int hour = now.get(Calendar.HOUR_OF_DAY);
        int minute = now.get(Calendar.MINUTE);

        int currentMinuteOfDay = ((hour * 60) + minute);

答案 1 :(得分:5)

我愚蠢,

这里是伪算法:

  1. Get the current time in hours and minutes
  2. Multiple hours * 60 + minutes, and this is your answer!

我建议使用Date类:

 Date date = new Date();

您可以在Date课程here上阅读更多内容。

如果您有任何疑问,请与我们联系!

答案 2 :(得分:5)

TL;博士

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
long minutesIntoTheDay = ChonoUnit.MINUTES.between( 
    zdt.toLocalDate().atStartOfDay( z ) ,
    zdt 
);

时区

其他答案不正确,因为他们未考虑时区。如果你想从一天开始,几天开始分钟?从加尔各答,巴黎或蒙特利尔出发的那一天? 23小时,24小时,25小时或其他一些长度的一天?

指定proper time zone name。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

使用java.time

通过指定ZonedDateTime获取所需/预期时区的当前时刻ZoneId

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );

要获得当天的分钟数,请获取当天的第一个时刻,然后计算已用时间。

ZonedDateTime startOfDay = now.toLocalDate().atStartOfDay( z );

将经过时间计算为Duration或使用ChronoUnit枚举。

Duration duration = Duration.between( startOfDay , now );
long minutesIntoTheDay = duration.toMinutes();

...或...

long minutesIntoTheDay = ChronoUnit.MINUTES.between( startOfDay , now );

示例:Europe/Amsterdam

以下示例显示了2017年3月26日凌晨2点时区for the Netherlands的DST转换(“春季前进”)Europe/Amsterdam

LocalDate march26 = LocalDate.of ( 2017, Month.MARCH, 26 );
LocalTime twoAm = LocalTime.of ( 2, 0 );
ZoneId z = ZoneId.of ( "Europe/Amsterdam" );
ZonedDateTime start = march26.atStartOfDay ( z );
ZonedDateTime stop = ZonedDateTime.of ( march26, twoAm, z );
long minutes = ChronoUnit.MINUTES.between ( start, stop );
Duration duration = Duration.between ( start, stop );
long durationAsMinutes = duration.toMinutes ( );
int minuteOfDay = stop.get ( ChronoField.MINUTE_OF_DAY );

转储到控制台。

System.out.println ( "start: " + start );
System.out.println ( "stop: " + stop );
System.out.println ( "minutes: " + minutes );
System.out.println ( "FYI: 4 * 60 = " + ( 4 * 60 ) + " | 3 * 60 = " + ( 3 * 60 ) + " | 2 * 60 = " + ( 2 * 60 ) );
System.out.println ( "duration.toString(): " + duration + " | durationAsMinutes: " + durationAsMinutes );
System.out.println ( "minuteOfDay: " + minuteOfDay );

您可以看到此code run live at IdeOne.com

  

开始时间:2017-03-26T00:00 + 01:00 [欧洲/阿姆斯特丹]

     

停止:2017-03-26T03:00 + 02:00 [欧洲/阿姆斯特丹]

     

分钟:120

     

仅供参考:4 * 60 = 240 | 3 * 60 = 180 | 2 * 60 = 120

     

duration.toString():PT2H | durationAsMinutes:120

     

minuteOfDay:180

输出中注意:

  • offset-from-UTC一小时更改,从+01:00更改为+02:00
  • 我们要求的时间是凌晨2点,但该日期没有这样的时间。时钟早上两点根本不存在,因为钟表在一小时前跳了一下。当然,时空不会弯曲也不会扭曲。在午夜到凌晨3点之间只有两个小时的实际时间,而不是三个小时。 java.time类的设计者选择通过将日期时间值调整为有效时间来解决问题。阅读文档以确保您理解并同意此类行为。
  • ChronoField.MINUTE_OF_DAY的结果不正确/准确,因为该功能仅考虑通用的24小时工作日而不是实际的异常日期,例如此日期与DST切换。我们看到180分钟,而实际上只有120分钟。

更正:此答案以前建议使用ChronoField.MINUTE_OF_DAY。这是一个糟糕的建议,因为该功能使用通用的24小时工作日。夏令时(DST)等异常将被忽略。因此,对于某些时区的特定日期,结果可能不准确/不正确。这种行为有明确记录:

  

ChronoField MINUTE_OF_DAY

     

public static final ChronoField MINUTE_OF_DAY

     

分钟。

     

这计算一天中的分钟,从0到(24 * 60) - 1.此字段对所有日历系统具有相同的含义。

     

解析此字段时,其行为与以下内容相同:该值在严格模式和智能模式下验证,但不在宽松模式下验证。该值将拆分为MINUTE_OF_HOUR和HOUR_OF_DAY字段。


关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

答案 3 :(得分:1)

将您的开始时间设置为午夜。然后,当您想要已经过的总分钟数时,只需抓住当前时间。然后抓住两次的整数,从startTime_hour中减去currentTime_hour

然后抓住时间的分钟组成部分,仅在currentTime分钟之内。使用以下关系将分钟转换为十进制:

30mins/.50

简单来说,30分钟= 0.50。在代码中它将如下所示:

currentTime_mins_decimal = .50 * currentTime_mins / 30;

现在您要将第一个减法的结果添加到currentTime_mins_decimal并将整个事物乘以60.

然后使用相同的关系从十进制转换为分钟:30mins/.50改变的好处是,如果你的开始时间不是午夜,而是有分钟的东西,让我们说12:55当你做算术你赢了得到准确的结果。

答案 4 :(得分:1)

根据Get current time and date on Android帖子的回答:

public int getTodayMinutesAsOfNow() {
    Calendar c = Calendar.getInstance(); 
    return c.get(Calendar.HOUR_OF_DAY)*60 + c.get(Calendar.MINUTE);
}