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

I'm*_*pid 1 java datetime android date android-calendar

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

I'm*_*pid 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);
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 6

TL;博士

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
long minutesIntoTheDay = ChronoUnit.MINUTES.between( 
    zdt.toLocalDate().atStartOfDay( z ) ,
    zdt 
);
Run Code Online (Sandbox Code Playgroud)

时区

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

指定正确的时区名称.切勿使用3-4字母缩写,例如ESTIST因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!).

使用java.time

ZonedDateTime通过指定a 获取当前时刻,以获得所需/预期时区ZoneId.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
Run Code Online (Sandbox Code Playgroud)

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

ZonedDateTime startOfDay = now.toLocalDate().atStartOfDay( z );
Run Code Online (Sandbox Code Playgroud)

计算经过的时间为a Duration或使用ChronoUnit枚举.

Duration duration = Duration.between( startOfDay , now );
long minutesIntoTheDay = duration.toMinutes();
Run Code Online (Sandbox Code Playgroud)

…要么…

long minutesIntoTheDay = ChronoUnit.MINUTES.between( startOfDay , now );
Run Code Online (Sandbox Code Playgroud)

例: Europe/Amsterdam

这是一个示例,显示了2017年3月26日凌晨2点荷兰在时区的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 );
Run Code Online (Sandbox Code Playgroud)

转储到控制台.

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 );
Run Code Online (Sandbox Code Playgroud)

您可以在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

请注意输出:

  • 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和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

现在处于维护模式Joda-Time项目建议迁移到java.time类.

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.

从哪里获取java.time类?


Dev*_*sai 5

我傻了,

这是伪算法:

  1. Get the current time in hours and minutes
  2. Multiple hours * 60 + minutes, and this is your answer!
Run Code Online (Sandbox Code Playgroud)

我建议使用Date类:

 Date date = new Date();
Run Code Online (Sandbox Code Playgroud)

你可以在这里阅读更多关于Date课程的内容.

请让我知道,如果你有任何问题!