Java:как преобразовать строку (HH:MM: SS) в длительность?
Я хочу преобразовать строку с форматом 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;
}
}
спасибо за помощь ... есть более простой способ сделать это ? - >создайте свой собственный класс продолжительности:
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);
}
преобразует значение типа int в строку для вывода/печати:
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;
}
7 ответов
код
myCdDuration
сбивает с толку. Вы хотите одинDuration
объект, эквивалентный тому, что было указано в строке, или списокDuration
объекты, где первый содержит часы, второй минуты и т. д.?вы не можете просто бросить
String
в какой-то другой объект. Вы должны проанализировать значение в числовой тип и использоватьDataTypeFactory
построить
Я предполагаю, что вы в конечном итоге пытаетесь достичь, чтобы вычислить продолжительность компакт-диска в секундах.
есть несколько способов сделать это, но я думаю, что проще всего просто разделить на :
чтобы получить поля часов, минут и секунд, а затем вычислить продолжительность вручную:
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;
tl; dr
нет необходимости определять свой собственный 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.
PT8H30M
и анализировать стандартный форматированный текст ISO 8601.
Duration.parse( "PT8H30M" ) // Parse standard ISO 8601 text yo get a `Duration` object.
избежать , теперь режим обслуживания, советует миграцию в java.время классы.
чтобы узнать больше, см. Oracle Учебник. И search Stack Overflow для многих примеров и объяснений. Спецификация JSR 310.
где получить java.время занятий?
-
Java SE 8 и SE 9 и позже
- встроенный.
- часть стандартного API Java со встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и зафиксировать.
-
Java SE 6 и SE 7
- большая часть java.функциональность времени обратно портирована на Java 6 & 7 в ThreeTen-Backport.
-
Android
- в ThreeTenABP проект приспосабливается ThreeTen-Backport (упомянуто выше) для Android конкретно.
- посмотреть как использовать ThreeTenABP....
на ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательной площадкой для возможных будущих дополнений к java.время. Вы можете найти некоторые полезные классы здесь такие как Interval
, YearWeek
, YearQuarter
и больше.
Я написал этот метод в своем классе utils для анализа различного рода строк длительности. Он довольно гибкий:
public static int getSecondsFromFormattedDuration(String duration){
if(duration==null)
return 0;
try{
Pattern patternDuration = Pattern.compile("\d+(?::\d+){0,2}");
int hours = 0;
int minutes = 0;
int seconds = 0;
if(patternDuration.matcher(duration).matches()){
String[] tokens = duration.split(":");
if(tokens.length==1){
seconds = Integer.parseInt(tokens[0]);
}else if(tokens.length == 2){
minutes = Integer.parseInt(tokens[0]);
seconds = Integer.parseInt(tokens[1]);
}else{
hours = Integer.parseInt(tokens[0]);
minutes = Integer.parseInt(tokens[1]);
seconds = Integer.parseInt(tokens[2]);
}
return 3600 * hours + 60 * minutes + seconds;
}else
return 0;
}catch (NumberFormatException ignored){
return 0;
}
}
вот как он проанализировал эти длительности:
"1" --> 1
"10" --> 10
"10:" --> 0 (not a valid duration)
"10:07" --> 607
"06:08" --> 368
"7:22" --> 442
":22" --> 0 (not a valid duration)
"10:32:33" --> 37953
"2:33:22" --> 9202
"2:2:02" --> 7322
"2:33:43:32" --> 0 (not a valid duration)
"33ff" --> 0 (not a valid duration)
"2d:33" --> 0 (not a valid duration)
Я бы предложил не используя javax.xml.datatype.Duration
, Как это связано с XML Java API, и это запутанно использовать его, если вы не имеете дело с XML. Более того, это абстрактный класс, и в Java SE нет его неабстрактной документированной реализации, поэтому вам придется либо создать свою собственную неабстрактную реализацию, либо получить экземпляр каким-то образом (возможно, играя с XML API).
вы управляете временем и датами в Java, используя Date
и Calendar
классы. К преобразовать String
s до Date
/Calendar
вы используете DateFormat
или SimpleDateFormat
. Это позволит вам выполнить арифметику продолжительности, хотя это не на 100% красиво.
Mansoor предоставляет способ делать вещи вручную, используя манипуляции со строками и обработку длительностей в качестве числовых значений - если вы делаете только простые вещи, это может быть проще сделать.
Если вам нужно выполнить более сложные вещи, вы можете посмотреть в http://joda-time.sourceforge.net/
С Java 8 и Java.время.Продолжительность вы можете сделать это, учитывая, что строка имеет формат HH: MM:SS или MM: SS или SS
Duration.ofSeconds(Arrays.stream(runtime.split(":"))
.mapToInt(n -> Integer.parseInt(n))
.reduce(0, (n, m) -> n * 60 + m));
пример, преобразует текущее время DateTime в Длительность в Java 7.
DatatypeFactory.newInstance().newDuration(Calendar.getInstance().getTimeInMillis())
выход -
P48Y5M13DT19H59M24.658S