到目前为止,在Java (Android)中,如何获得一天中的总分钟数?这个是可能的吗?例如,如果是凌晨12:37分,我希望它返回int 37 (到今天为止只有37分钟)。或者,如果是凌晨1点41分,我希望它返回int 101 (那天为止是101分钟),或者如果是下午12点20分,它将返回int 740 (当天总共740分钟)。
发布于 2014-09-09 06:40:14
tl;dr
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
long minutesIntoTheDay = ChronoUnit.MINUTES.between(
zdt.toLocalDate().atStartOfDay( z ) ,
zdt
);时区
其他答案是不正确的,因为它们没有说明时区。如果你想要从一天开始的几分钟,哪一天?从加尔各答,巴黎,还是蒙特雷尔开始的一天?23小时,24小时,25小时,还是其他长的一天?
指定一个适当时区名称。不要使用3-4字母的缩写,如EST或IST,因为它们不是真正的时区,不标准化,甚至不是唯一的(!)。
使用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点时区代表荷兰在时区Europe/Amsterdam中的DST切线(“Spring”)
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 );你可以看到这个在IdeOne.com现场运行的代码。
起点:2017-03-26T00:00+01:00欧洲/阿姆斯特丹 停站:2017-03-26T03:00+02:00欧洲/阿姆斯特丹 会议记录: 120 财政年度:4* 60 = 240 x 3* 60 = 180 x 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 公共静态最终ChronoField MINUTE_OF_DAY 一天中的一分钟。 从0到(24 * 60) - 1,这个字段对所有日历系统都有相同的意义。 在解析此字段时,它的行为相当于以下内容:该值在严格和智能模式下进行验证,而不是在宽松模式下验证。该值被拆分成MINUTE_OF_HOUR和HOUR_OF_DAY字段。
关于java.time
java.time框架内置到Java8和更高版本中。这些类取代了麻烦的旧遗赠日期时间类,如java.util.Date、Calendar和SimpleDateFormat。
尤达-时间项目现在在维护模式中,建议迁移到java.time类。
要了解更多信息,请参见Oracle教程。并搜索堆栈溢出以获得许多示例和解释。规范是JSR 310。
在哪里获得java.time类?
发布于 2014-09-09 04:03:02
实际上,我使用了日历类来解决这个问题。
下面是代码,currentMinuteOfDay是总分钟数。
Calendar now = Calendar.getInstance();
int hour = now.get(Calendar.HOUR_OF_DAY);
int minute = now.get(Calendar.MINUTE);
int currentMinuteOfDay = ((hour * 60) + minute);发布于 2014-09-09 03:57:04
我和愚蠢的人在一起
下面是伪算法:
1. Get the current time in hours and minutes
2. Multiple hours * 60 + minutes, and this is your answer!我建议使用日期类:
Date date = new Date();您可以在Date类这里上阅读更多内容。
如果你有任何问题请告诉我!
https://stackoverflow.com/questions/25736410
复制相似问题