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分钟).
我实际上使用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)
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字母缩写,例如EST或IST因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!).
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
请注意输出:
+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和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.
现在处于维护模式的Joda-Time项目建议迁移到java.time类.
要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.
从哪里获取java.time类?
我傻了,
这是伪算法:
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课程的内容.
请让我知道,如果你有任何问题!
| 归档时间: |
|
| 查看次数: |
7398 次 |
| 最近记录: |