我有一个'HH:mm'格式的输入字符串,其中时间分隔符是根据区域设置设置的(例如,美国的'10:45'或意大利的'10 .45')。我需要将其转换为分钟数。
以下是我提出的建议:
String timeSeparator = getTimeSeparator(locale);
String[] duration = durationString.split(Pattern.quote(timeSeparator));
int minutes = Integer.valueOf(duration[0])*60 + Integer.valueOf(duration[1]);
从https://stackoverflow.com/a/7612009/7753225 获取的 getTimeSeparator
方法
有没有更简单的方法?例如,使用`java.time'。
答案 0 :(得分:1)
在Java 8中,您可以使用DateTimeFormatter.ofLocalizedTime
来获取特定于语言环境的日期时格式化程序。然后,您可以将其用于parse the string into a LocalTime
和extract the minute field。
public static int getMinute(String timeString, Locale locale) {
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT)
.withLocale(locale);
LocalTime time = LocalTime.parse(timeString, formatter);
return time.getHour()*60 + time.getMinute();
}
示例:
System.out.println(getMinute("10.47", new Locale("fi"))); // 647
System.out.println(getMinute("11:23", Locale.ROOT)); // 683
如果您不关心时间分隔符,我们可以使用固定模式。
public static int getMinute(String timeString, Locale locale) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH[:][.]mm", locale);
LocalTime time = LocalTime.parse(timeString, formatter);
return time.getHour()*60 + time.getMinute();
}
([…]
表示可选,因此它将匹配HH:mm
,HH.mm
,HHmm
和HH:.mm
)
答案 1 :(得分:1)
Duration.parse(
"PT" +
"10:45".replace( ":" , "M" )
.replace( "-" , "M" )
.replace( "." , "M" )
.replace( "," , "M" )
+ "S"
).toMinutes()
“10:45”→PT10M45S→10
ISO 8601标准定义了未附加到时间线的此类时间范围的格式:PnYnMnDTnHnMnS
P
标志着开始。 T
将任何年 - 月 - 天与小时 - 分 - 秒分开。所以一个半小时是PT1H30M
。你的十分四十五秒的例子是PT10M45S
。
执行简单的字符串操作,将输入转换为此格式。
String input = "10:45" ;
String inputStandardized = "PT" +
input.replace( ":" , "M" )
.replace( "-" , "M" )
.replace( "." , "M" )
.replace( "," , "M" )
+ "S" ;
PT10M45S
Duration
解析为Duration
。在解析和生成字符串时,java.time类默认使用ISO 8601格式。因此无需指定格式化模式。
Duration duration = Duration.parse( inputStandardized );
duration.toString():PT10M45S
您可以使用Duration
对象进行日期时间数学运算,转到plus
和minus
。因此,您可能不需要分钟数作为整数。但是你可以要求持续时间内的总分钟数。
long minutes = duration.toMinutes();
10
请参阅此code run live at IdeOne.com。
提示:在一段时间内使用时钟时间格式会产生麻烦。模棱两可导致混乱和错误。我建议使用标准的ISO 8601格式作为持续时间,因为它们被设计为明确,易于阅读和易于解析。
答案 2 :(得分:1)
请注意非常优雅,但它可以完成这项工作
.wrap {
height: 2000px;
}
section#overview{
width: 100%
background: linear-gradient(to bottom, rgba(206,206,206,0.3), rgba(206,206,206,1));
}
aside {
float: right;
width: 25%;
height: 100%;
background: linear-gradient(to bottom, rgba(206,206,206,0.3), rgba(206,206,206,1));
}
答案 3 :(得分:0)
您可以使用getLocalizedDateTimePattern
方法获取初始化DateTimeFormatter
的模式,以使用给定的区域设置解析时间。第一个null
代表您在案件中不需要的日期。
String timePattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
null, FormatStyle.SHORT, IsoChronology.INSTANCE, locale);
然后使用它来创建格式化程序(请注意,您必须再次指定区域设置):
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(timePattern, locale);
如果不是SHORT
locale
时间格式,而是"HHcmm"
'c'
,locale
是一个非数字字符,它是String[] duration = durationString.split("\\D");
int minutes = parseInt(duration[0])*60 + parseInt(duration[1]);
的时间分隔符然后是:
从文本中提取数字
DateTimeFormatter
使用时间分隔符
制作DateTimeFormatter dtf = DateTimeFormatter.ofPattern(
String.format("HH%smm", timeSeparator), locale);
LocalTime time = LocalTime.parse(text, dtf);
int minutes = time.toSecondOfDay() / 60;
int minutes = ChronoUnit.MINUTES.between(LocalTime.MIN, time);
或者如果你必须
let integerArray: [Int] = [1,2,3,4,5]
UserDefaults.standard.set(integerArray, forKey: "sugarArray")
答案 4 :(得分:0)
首先将时间解析为launchservicesd[83]: SecTaskLoadEntitlements failed error=22
个实例,然后使用LocalTime
计算到当天开始的差异:
Duration
以上结果为645