首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >到目前为止,如何获得一天中的总分钟数?

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

Stack Overflow用户
提问于 2014-09-09 03:48:45
回答 5查看 12.9K关注 0票数 5

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-09-09 06:40:14

tl;dr

代码语言:javascript
复制
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字母的缩写,如ESTIST,因为它们不是真正的时区,不标准化,甚至不是唯一的(!)。

使用java.time

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

代码语言:javascript
复制
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );

若要获取一天中的分钟数,请获取一天中的第一分钟,然后计算经过的时间。

代码语言:javascript
复制
ZonedDateTime startOfDay = now.toLocalDate().atStartOfDay( z );

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

代码语言:javascript
复制
Duration duration = Duration.between( startOfDay , now );
long minutesIntoTheDay = duration.toMinutes();

…或…

代码语言:javascript
复制
long minutesIntoTheDay = ChronoUnit.MINUTES.between( startOfDay , now );

示例:Europe/Amsterdam

下面是一个例子,展示了2017年3月26日凌晨2点时区代表荷兰在时区Europe/Amsterdam中的DST切线(“Spring”)

代码语言:javascript
复制
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 );

转储到控制台。

代码语言:javascript
复制
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
  • 我们要求的时间是凌晨2点,但那天没有这样的时间.早上两点根本不存在,因为时钟提前了一个小时。当然,时空既不弯曲也不扭曲。从午夜到凌晨3点之间只有两个小时的实际时间,而不是三个小时。java.time类的设计人员选择通过将前一天的时间值调整为有效的一天时间来解决问题。请阅读文档,以确保您理解并同意这种行为。
  • 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.DateCalendarSimpleDateFormat

尤达-时间项目现在在维护模式中,建议迁移到java.time类。

要了解更多信息,请参见Oracle教程。并搜索堆栈溢出以获得许多示例和解释。规范是JSR 310

在哪里获得java.time类?

  • Java 8东南9以及后来的
    • 内置的。
    • 带有捆绑实现的标准Java的一部分。
    • Java 9添加了一些次要的特性和修复。

票数 6
EN

Stack Overflow用户

发布于 2014-09-09 04:03:02

实际上,我使用了日历类来解决这个问题。

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

代码语言:javascript
复制
Calendar now = Calendar.getInstance();
        int hour = now.get(Calendar.HOUR_OF_DAY);
        int minute = now.get(Calendar.MINUTE);

        int currentMinuteOfDay = ((hour * 60) + minute);
票数 16
EN

Stack Overflow用户

发布于 2014-09-09 03:57:04

我和愚蠢的人在一起

下面是伪算法:

代码语言:javascript
复制
  1. Get the current time in hours and minutes
  2. Multiple hours * 60 + minutes, and this is your answer!

我建议使用日期类:

代码语言:javascript
复制
 Date date = new Date();

您可以在Date这里上阅读更多内容。

如果你有任何问题请告诉我!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25736410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档