您的问题实际上是两个问题:
- 如何解析字符串以获取日期时间对象
- 如何从日期时间对象获取自一天开始以来的分钟数
第一个,将字符串解析为日期时间,已在 Stack Overflow 上的 at least 1,845 times 中介绍过,因此我将跳过它。第二个问题在下面解决。
请尽量让您的问题更清楚。并尽可能专注于单个主题,因为这就是 Stack Overflow 的意图。
每日分钟
您似乎想要的是“Minutes-Of-Day”,即自一天开始以来的分钟数。
这里要小心和深思熟虑,因为有两种不同的定义来表示一天中的分钟。您可以获得特定时区中特定日期的实际分钟数。或者您可以计算一般的 24 小时一天。由于夏令时 (DST) 和其他异常情况,一天不一定是 24 小时。例如,在美国大部分地区,使用 DST 意味着一天可能有 23、24 或 25 小时。
问题的代码和其他答案忽略了时区的关键问题(日期时间工作中的常见错误)。如果您不指定时区,则会静默应用您的 JVM 的当前默认时区。不好……默认值可以随时更改,即使在运行时期间!最好始终指定您期望/希望的时区。
避免使用旧的日期时间类
与最早版本的 Java 捆绑在一起的旧日期时间类是出了名的麻烦。避开他们。而是使用 Java 8 及更高版本中内置的java.time 框架(请参阅Tutorial)。如果您无法使用该技术,请使用 Joda-Time 库(它启发了 java.time)。以下示例位于 Java 8 Update 66 中的 java.time 中。
java.time
让我们来看看 2015 年 3 月 3 日。这一天是美国大部分地区的“春天提前”夏令时转换日。时钟从凌晨 2 点跳到了凌晨 3 点。所以03:00:00.0 在这一天意味着自一天开始以来实际上已经过去了两个小时(120 分钟)。如果我们将其视为一般的 24 小时一天,我们会说过去了三个小时(180 分钟)。 java.time 类可以在这两种定义中计算分钟。
首先,我们在转换日凌晨 3 点。我们使用能够识别 DST 的时区之一。
ZoneId zoneId = ZoneId.of ( "America/Los_Angeles" );
ZonedDateTime zdt = ZonedDateTime.of ( 2015 , 3 , 8 , 3 , 0 , 0 , 0 , zoneId );
一般 24 小时制
接下来,假设一天 24 小时,我们将获取自一天开始以来的分钟数。 ChronoField 枚举提供了许多访问TemporalField 值的方法,例如MINUTE_OF_DAY。
long minutesOfDayForGeneric24HourDay = zdt.get ( ChronoField.MINUTE_OF_DAY );
实际日期
要获得 DST 更改的特定时区从这一特定日期开始以来经过的实际分钟数,我们必须做更多的工作。我们必须确定一天中的第一个时刻,我们可以从中计算经过的时间。为了获得第一刻,我们必须通过 LocalDate 类,这是一个没有时间和时区的仅日期值。在那个LocalDate 对象上,我们调用atStartOfDay 来调整回日期时间值(ZonedDateTime)。您可能认为可以通过假设一天从 00:00:00.0 开始来跳过此步骤,但事实并非总是如此。
ZonedDateTime zdtStart = zdt.toLocalDate ().atStartOfDay ( zoneId );
现在计算经过的时间。 Duration 类将时间跨度表示为小时、分钟和秒。从 Duration 我们可以询问总分钟数,将小时转换为分钟。
Duration duration = Duration.between ( zdtStart , zdt );
long minutesOfDayForActualDay = duration.toMinutes ();
转储到控制台。请注意通用的ChronoField 方法如何表示180 分钟,而实际的Duration 方法产生120 分钟。
System.out.println ( "zdt: " + zdt + " | minutesOfDayForGeneric24HourDay: " + minutesOfDayForGeneric24HourDay + " | duration: " + duration + " | minutesOfDayForActualDay: " + minutesOfDayForActualDay );
zdt: 2015-03-08T03:00-07:00[美国/洛杉矶] | minutesOfDayForGeneric24HourDay: 180 |持续时间:PT2H | minutesOfDayForActualDay: 120