到目前为止,如何获得Java(Android)中当天的总分钟数?这可能吗? 例如,如果是凌晨12:37,我希望它返回int 37(当天到目前为止37分钟)。或者如果它是凌晨1:41,我希望它返回int 101(当天到目前为止101分钟),或者如果它在下午12:20,它将返回int 740(当天总共740分钟)。
答案 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)
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的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
输出中注意:
+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类?
答案 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);
}