Saltar al contenido

Java: Cómo convertir un string (HH: MM: SS) a una duración?

Solución:

tl; dr

No es necesario definir el tuyo propio Duration class, ya que Java proporciona una.

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

Y analice el texto con formato estándar ISO 8601.

Duration.parse( "PT8H30M" )   // Parse standard ISO 8601 text yo get a `Duration` object. 

Tabla de clases de intervalo de tiempo en Java y en el proyecto ThreeTen-Extra


Evitar HH:MM:SS formato

Si por el string 08:30:00 te refieres a un período de tiempo de “ocho horas y media” en lugar de una hora del día “las ocho y media de la mañana”, luego evita ese formato de HH:MM:SS. Ese formato es ambiguo, que parece ser una hora del día. En su lugar, utilice el formato estándar ISO 8601 que se analiza a continuación.

La duración y la hora del día son dos conceptos muy diferentes. Debes tenerlos claros, cada uno debe ser distinto en tu mente. Usar el formato ambiguo de HH: MM: SS hace que esa distinción sea aún más difícil (¡así que evite ese formato!).

java.time

La forma moderna es con las clases java.time.

LocalTime

Primero analiza tu string como un LocalTime. Esta clase representa una hora del día sin fecha y sin zona horaria. No tener zona horaria significa que estos objetos se basan en un reloj genérico de 24 horas sin tener en cuenta anomalías como el horario de verano (DST).

Realmente no queremos un LocalTime como su entrada string representa un lapso de tiempo en lugar de una hora del día. Pero este es solo el primer paso.

LocalTime lt = LocalTime.parse ( "08:30:00" );

Duration

Para representar el lapso de tiempo deseado, queremos que el Duration clase. Esta clase es para períodos de tiempo que no se adjuntan a la línea de tiempo. Podemos crear uno convirtiendo eso LocalTime obteniendo la cantidad de tiempo desde el comienzo del reloj de la hora del día, 00:00:00.0 o LocalTime.MIN, y el lt acabamos de crear una instancia.

Duration d = Duration.between ( LocalTime.MIN , lt );

Editando la entrada string

El enfoque anterior usando LocalTime solo funciona si sus cadenas de entrada representan una duración de menos de 24 horas. Si son más de 24 horas, analizará la entrada string tú mismo.

Algo parecido al siguiente código. Por supuesto, el análisis real depende de resolver la ambigüedad de su entrada particular string. Es 50:00 destinado a ser cincuenta horas o cincuenta minutos? (Esta ambigüedad es una razón importante para evitar este formato confuso siempre que sea posible y seguir con los formatos 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." );

ISO 8601

Podemos ver el resultado generando una Cadena en formato estándar ISO 8601 para duraciones simplemente llamando Duration::toString. Las clases java.time usan ISO 8601 de forma predeterminada al analizar / generar cadenas. Para duraciones, el formato estándar es PnYnMnDTnHnMnS donde el P marca el comienzo y el T separa la parte años-meses-días de la parte horas-minutos-segundos. Entonces, nuestras ocho horas y media aparecerán como PT8H30M.

System.out.println (“d.toString ():” + d);

d.toString (): PT8H30M

Coleccionando Duration objetos

Puedes hacer un List sosteniendo elementos del tipo Duration.

List 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" ) ) ) ;

durations.toString (): [PT8H30M, PT3H, PT1H15M]

Recuerde que las cadenas que ve en esa salida como PT8H30M son solo eso: salida de cadenas generadas. los Duration el tipo es no un simple string sino mas bien genera un objeto String por su toString método.

Si se adhiere a los formatos ISO 8601, puede analizar fácilmente y generar dichas cadenas. No es necesario pasar por el LocalTime rigamarole de conversión que realizamos en la parte superior de esta respuesta.

Duration d = Duration.parse( "PT8H30M" );

Vea este código de ejemplo en vivo en IdeOne.com.


Acerca de java.time

El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantan las antiguas y problemáticas clases de fecha y hora heredadas, como java.util.Date, CalendarY SimpleDateFormat.

El proyecto Joda-Time, ahora en modo de mantenimiento, aconseja la migración a las clases java.time.

Para obtener más información, consulte el tutorial de Oracle. Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310.

¿Dónde obtener las clases java.time?

  • Java SE 8 y SE 9 y después
    • Incorporado.
    • Parte de la API estándar de Java con una implementación integrada.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y SE 7
    • Gran parte de la funcionalidad de java.time está retroportada a Java 6 y 7 en ThreeTen-Backport.
  • Androide
    • los ThreeTenABP el proyecto se adapta ThreeTen-Backport (mencionado anteriormente) para Android específicamente.
    • Ver Cómo usar ThreeTenABP….

El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuarter, y más.

Supongo que lo que en última instancia está tratando de lograr es calcular la duración del CD en segundos.

Hay varias formas de hacer esto, pero creo que la más sencilla es simplemente dividir : para obtener los campos de horas, minutos y segundos, luego para calcular la duración manualmente:

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;

  1. Tu myCdDuration es confuso. Quieres unoDuration objeto equivalente a lo que se especificó en el string, o una lista de Duration objetos donde el primero contiene las horas, el segundo minutos, etc.

  2. No puedes simplemente lanzar un String en algún otro objeto. Debe analizar el valor en un tipo numérico y usar DataTypeFactory para construir el Duration objeto.

Si sostienes algún titubeo y capacidad de acrecentar nuestro artículo puedes ejecutar una aclaración y con placer lo interpretaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *