到目前为止,如何获得Java(Android)中当天的总分钟数?这可能吗?例如,如果是凌晨12:37,我希望它返回int 37(当天到目前为止37分钟)。或者如果它是凌晨1:41,我希望它返回int 101(当天到目前为止101分钟),或者如果它在下午12:20,它将返回int 740(当天总共740分钟)。
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。切勿使用诸如EST
或IST
之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
通过指定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的夏令时切换(“Spring forward”)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
请注意输出:
+01:00
,+02:00
变化了一个小时。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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.Date
,Calendar
和SimpleDateFormat
。
现在在Joda-Time的maintenance mode项目建议迁移到java.time班。
要了解更多信息,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规格是JSR 310。
从哪里获取java.time类?
我实际上使用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. 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上阅读更多内容。
请让我知道,如果你有任何问题!
将您的开始时间设置为午夜。然后,当您想要已经过的总分钟数时,只需抓住当前时间。然后抓住两次的整数,从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当你做算术时你将得不到准确的结果。
根据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);
}