Fra*_*ank 18 java string duration
我想将格式为HH:MM:SS或MM:SS或SS的字符串转换为持续时间的数据类型.
解:
private ArrayList<Duration> myCdDuration = new ArrayList<Duration>();
private void convert(String aDuration) {
chooseNewDuration(stringToInt(splitDuration(aDuration))); //stringToInt() returns an int[] and splitDuration() returns a String[]
}
private void chooseNewDuration(int[] array) {
int elements = array.length;
switch (elements) {
case 1:
myCdDuration.add(newDuration(true, 0, 0, 0, 0, 0, array[0]));
break;
case 2:
myCdDuration.add(newDuration(true, 0, 0, 0, 0, array[0], array[1]));
break;
case 3:
myCdDuration.add(newDuration(true, 0, 0, 0, array[0], array[1],
array[2]));
break;
}
}
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助...任何更简单的方法吗? - >创建自己的Duration类:
public class Duration {
private int intSongDuration;
private String printSongDuration;
public String getPrintSongDuration() {
return printSongDuration;
}
public void setPrintSongDuration(int songDuration) {
printSongDuration = intToStringDuration(songDuration);
}
public int getIntSongDuration() {
return intSongDuration;
}
public void setIntSongDuration(int songDuration) {
intSongDuration = songDuration;
}
public Duration(int songDuration) {
setIntSongDuration(songDuration);
}
Run Code Online (Sandbox Code Playgroud)
将int值转换为String以进行输出/打印:
private String intToStringDuration(int aDuration) {
String result = "";
int hours = 0, minutes = 0, seconds = 0;
hours = aDuration / 3600;
minutes = (aDuration - hours * 3600) / 60;
seconds = (aDuration - (hours * 3600 + minutes * 60));
result = String.format("%02d:%02d:%02d", hours, minutes, seconds);
return result;
}
Run Code Online (Sandbox Code Playgroud)
Bas*_*que 21
不需要定义自己的Duration类,因为Java提供了一个类.
Duration.between ( // Represent a span of time of hours, minutes, seconds.
LocalTime.MIN , // 00:00:00
LocalTime.parse ( "08:30:00" ) // Parse text as a time-of-day.
) // Returns a `Duration` object, a span-of-time.
.toString() // Generate a `String` with text in standard ISO 8601 format.
Run Code Online (Sandbox Code Playgroud)
PT8H30M
并解析标准ISO 8601格式的文本.
Duration.parse( "PT8H30M" ) // Parse standard ISO 8601 text yo get a `Duration` object.
Run Code Online (Sandbox Code Playgroud)
HH:MM:SS格式化如果字符串08:30:00你的意思是"八个半小时"的时间跨度而不是一个时间"早上八点半",那么避免使用那种格式HH:MM:SS.这种格式含糊不清,看起来像是一个时间.而是使用下面讨论的标准ISO 8601格式.
持续时间和时间是两个截然不同的概念.你必须清楚它们,每一个都应该在你的脑海中清晰.使用HH的模糊格式:MM:SS使得区别变得更加困难(因此避免使用该格式!).
现代方法是使用java.time类.
LocalTime首先将您的字符串解析为LocalTime.此类表示没有日期且没有时区的时间.没有时区意味着这些对象基于通用的24小时时钟,而不考虑夏令时(DST)等异常情况.
我们并不真正想要一个,LocalTime因为您的输入字符串代表一段时间而不是一个时间.但这只是第一步.
LocalTime lt = LocalTime.parse ( "08:30:00" );
Run Code Online (Sandbox Code Playgroud)
Duration为了表示所需的时间跨度,我们需要Duration该类.此课程适用于未附加到时间轴的时间跨度.我们可以通过转换创建一个LocalTime通过从时间-日期时钟,一开始得到的时间量00:00:00.0或LocalTime.MIN和lt我们刚才实例.
Duration d = Duration.between ( LocalTime.MIN , lt );
Run Code Online (Sandbox Code Playgroud)
上述方法LocalTime仅适用于输入字符串表示持续时间少于24小时的情况.如果超过24小时,您将自己解析输入字符串.
类似下面的代码.当然,实际的解析取决于解决特定输入字符串的歧义.是50:00五十小时还是五十分钟?(这种模糊性是尽可能避免这种混淆格式的强烈理由,并坚持使用ISO 8601格式.)
String input = "50:00"; // Or "50:00:00" (fifty hours, either way)
String[] parts = input.split ( ":" );
Duration d = Duration.ZERO;
if ( parts.length == 3 ) {
int hours = Integer.parseInt ( parts[ 0 ] );
int minutes = Integer.parseInt ( parts[ 1 ] );
int seconds = Integer.parseInt ( parts[ 2 ] );
d = d.plusHours ( hours ).plusMinutes ( minutes ).plusSeconds ( seconds );
} else if ( parts.length == 2 ) {
int hours = Integer.parseInt ( parts[ 0 ] );
int minutes = Integer.parseInt ( parts[ 1 ] );
d = d.plusHours ( hours ).plusMinutes ( minutes );
} else {
System.out.println ( "ERROR - Unexpected input." );
}
Run Code Online (Sandbox Code Playgroud)
我们可以通过简单地调用生成标准ISO 8601格式的字符串来查看结果Duration::toString.解析/生成字符串时,java.time类在默认情况下使用ISO 8601.如果持续时间,标准格式是PnYnMnDTnHnMnS在P标记的开始和T分离小时-分-秒部分的年,月,日部分.所以,我们的八个半小时将显示为PT8H30M.
System.out.println("d.toString():"+ d);
d.toString():PT8H30M
Duration对象您可以制作List该类型的保持元素Duration.
List<Duration> durations = new ArrayList<>( 3 ); // Initial capacity of 3 elements.
durations.add( d ) ;
durations.add( Duration.between ( LocalTime.MIN , LocalTime.parse ( "03:00:00" ) ) ) ;
durations.add( Duration.between ( LocalTime.MIN , LocalTime.parse ( "01:15:00" ) ) ) ;
Run Code Online (Sandbox Code Playgroud)
durations.toString():[PT8H30M,PT3H,PT1H15M]
请记住,您在该输出中看到的字符串PT8H30M就是:生成的字符串的输出.的Duration类型是不是一个简单的字符串,而是产生由它的一个字符串对象toString方法.
如果您坚持使用ISO 8601格式,您可以轻松解析以及生成此类字符串.无需完成LocalTime我们在本答案顶部执行的转换操作.
Duration d = Duration.parse( "PT8H30M" );
Run Code Online (Sandbox Code Playgroud)
在IdeOne.com中查看此示例代码.
该java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.
现在处于维护模式的Joda-Time项目建议迁移到java.time类.
要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.
从哪里获取java.time类?
该ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.
Man*_*qui 19
我假设你最终想要实现的是以秒为单位计算CD的持续时间.
有几种方法可以做到这一点,但我认为最直接的方法是分开:以获取小时,分钟和秒字段,然后手动计算持续时间:
String timestampStr = "14:35:06";
String[] tokens = timestampStr.split(":");
int hours = Integer.parseInt(tokens[0]);
int minutes = Integer.parseInt(tokens[1]);
int seconds = Integer.parseInt(tokens[2]);
int duration = 3600 * hours + 60 * minutes + seconds;
Run Code Online (Sandbox Code Playgroud)
你的myCdDuration很混乱。您是否想要一个 Duration与字符串中指定的内容等效的对象,或者Duration第一个包含小时、第二个分钟等的对象列表?
你不能只是将 a 投射String到其他对象中。您应该将值解析为数字类型并用于DataTypeFactory构造Duration对象。