¿Hay alguna forma de lograr esto con Java 8 Duration?
IgorGanapolsky
2
Si tpuede ser <0(negativo), la segunda línea debería ser int minutes = Math.abs(t) % 60;.
Wittich
1
y también si quieres am o pm con la hora agrega esta condición String amOrPm; if (timeInminutes> = 720) amOrPm = "PM"; else amOrPm = "AM"; Cadena ConvertTime = horas + ":" + minutos + amOrPm;
SFAH
¿Qué hacer con las configuraciones regionales que no son AM / PM? Esta es solo una solución parcial, no localizada.
Las clases java.time incluyen un par de clases para representar períodos de tiempo. La Durationclase es para horas-minutos-segundos y Periodes para años-meses-días.
Duration d = Duration.ofMinutes( 260L );
Duration partes
Acceda a cada parte del Durationllamando to…Part. Estos métodos se agregaron en Java 9 y versiones posteriores.
long days = d.toDaysPart() ;
int hours = d.toHoursPart() ;
int minutes = d.toMinutesPart() ;
int seconds = d.toSecondsPart() ;
int nanos = d.toNanosPart() ;
Luego, puede ensamblar su propia cuerda a partir de esas partes.
ISO 8601
El estándar ISO 8601 define formatos textuales para valores de fecha y hora. Para lapsos de tiempo no vinculados a la línea de tiempo, el formato estándar es PnYnMnDTnHnMnS. El Pmarca el comienzo y Tsepara los años-meses-días de las horas-minutos-segundos. Entonces una hora y media es PT1H30M.
Las clases java.time utilizan formatos ISO 8601 de forma predeterminada para analizar y generar cadenas. Las clases Durationy Periodutilizan este formato estándar en particular. Así que simplemente llama toString.
String output = d.toString();
PT4H20M
Para un formato alternativo, cree su propia cadena en Java 9 y posterior ( no en Java 8) con los Duration::to…Partmétodos. O vea esta respuesta para usar regex para manipular la cadena con formato ISO 8601.
LocalTime
Sugiero encarecidamente utilizar el formato estándar ISO 8601 en lugar del formato de reloj extremadamente ambiguo y confuso de 04:20. Pero si insistes, puedes conseguir este efecto pirateando con la LocalTimeclase. Esto funciona si su duración no supera las 24 horas.
LocalTime hackUseOfClockAsDuration = LocalTime.MIN.plus( d );
String output = hackUseOfClockAsDuration.toString();
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 .
El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuarter, y más .
Bien, estoy buscando algo como esto, pero me gustaría obtener el resultado como "4h 20m" o "4h 20min" en lugar de "PT4H20M" o "04:20". ¿Supongo que tendré que usar algún tipo de método de formato?
Aditsu renunció porque SE es MALVADO
@aditsuquitbecauseSEisEVIL Java 9 trajo los Duration::to…Partmétodos que se muestran mis ediciones a esta Respuesta. Puede ensamblar fácilmente su propia cuerda a partir de esas partes.
Basil Bourque
12
También puede utilizar la clase TimeUnit . Podrías definir
Cadena final estática privada FORMAT = "% 02d:% 02d:% 02d";
long d1Ms=asa.getTime();
long d2Ms=asa2.getTime();
long minute = Math.abs((d1Ms-d2Ms)/60000);
int Hours = (int)minute/60;
int Minutes = (int)minute%60;
stUr.setText(Hours+":"+Minutes);
los dos anteriores suprimirán los números de presión
desarrollador
1
Prueba este código:
import java.util.Scanner;
publicclassBasicElement{
publicstaticvoidmain(String[] args){
Scanner input = new Scanner(System.in);
int hours;
System.out.print("Enter the hours to convert:");
hours =input.nextInt();
int d=hours/24;
int m=hours%24;
System.out.println(d+"days"+" "+m+"hours");
}
}
Dada la entrada en segundos, puede transformar al formato hh: mm: ss de esta manera:
int hours;
int minutes;
int seconds;
int formatHelper;
int input;
//formatHelper maximum value is 24 hours represented in seconds
formatHelper = input % (24*60*60);
//for example let's say format helper is 7500 seconds
hours = formatHelper/60*60;
minutes = formatHelper/60%60;
seconds = formatHelper%60;
//now operations above will give you result = 2hours : 5 minutes : 0 seconds;
He usado formatHelper ya que la entrada puede ser de más de 86 400 segundos, que son 24 horas.
Si desea que el tiempo total de su entrada esté representado por hh: mm: ss, puede simplemente evitar formatHelper.
import java.util.Scanner;
publicclassTime{
publicstaticvoidmain(String[]args){
int totMins=0;
int hours=0;
int mins=0;
Scanner sc= new Scanner(System.in);
System.out.println("Enter the time in mins: ");
totMins= sc.nextInt();
hours=(int)(totMins/60);
mins =(int)(totMins%60);
System.out.printf("%d:%d",hours,mins);
}
}
Respuestas:
Si tu tiempo está en una variable llamada
t
int hours = t / 60; //since both are ints, you get an int int minutes = t % 60; System.out.printf("%d:%02d", hours, minutes);
No podría ser más fácil
fuente
Duration
?t
puede ser<0
(negativo), la segunda línea debería serint minutes = Math.abs(t) % 60;
.tl; dr
Duration.ofMinutes( 260L ) .toString()
... o ...
LocalTime.MIN.plus( Duration.ofMinutes( 260L ) ).toString()
Duration
Las clases java.time incluyen un par de clases para representar períodos de tiempo. La
Duration
clase es para horas-minutos-segundos yPeriod
es para años-meses-días.Duration d = Duration.ofMinutes( 260L );
Duration
partesAcceda a cada parte del
Duration
llamandoto…Part
. Estos métodos se agregaron en Java 9 y versiones posteriores.long days = d.toDaysPart() ; int hours = d.toHoursPart() ; int minutes = d.toMinutesPart() ; int seconds = d.toSecondsPart() ; int nanos = d.toNanosPart() ;
Luego, puede ensamblar su propia cuerda a partir de esas partes.
ISO 8601
El estándar ISO 8601 define formatos textuales para valores de fecha y hora. Para lapsos de tiempo no vinculados a la línea de tiempo, el formato estándar es
PnYnMnDTnHnMnS
. ElP
marca el comienzo yT
separa los años-meses-días de las horas-minutos-segundos. Entonces una hora y media esPT1H30M
.Las clases java.time utilizan formatos ISO 8601 de forma predeterminada para analizar y generar cadenas. Las clases
Duration
yPeriod
utilizan este formato estándar en particular. Así que simplemente llamatoString
.Para un formato alternativo, cree su propia cadena en Java 9 y posterior ( no en Java 8) con los
Duration::to…Part
métodos. O vea esta respuesta para usar regex para manipular la cadena con formato ISO 8601.LocalTime
Sugiero encarecidamente utilizar el formato estándar ISO 8601 en lugar del formato de reloj extremadamente ambiguo y confuso de
04:20
. Pero si insistes, puedes conseguir este efecto pirateando con laLocalTime
clase. Esto funciona si su duración no supera las 24 horas.Acerca de java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como
java.util.Date
,Calendar
, ySimpleDateFormat
.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?
El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como
Interval
,YearWeek
,YearQuarter
, y más .fuente
Duration::to…Part
métodos que se muestran mis ediciones a esta Respuesta. Puede ensamblar fácilmente su propia cuerda a partir de esas partes.También puede utilizar la clase TimeUnit . Podrías definir
puede tener un método como:fuente
Úselo
java.text.SimpleDateFormat
para convertir minutos en horas y minutosSimpleDateFormat sdf = new SimpleDateFormat("mm"); try { Date dt = sdf.parse("90"); sdf = new SimpleDateFormat("HH:mm"); System.out.println(sdf.format(dt)); } catch (ParseException e) { e.printStackTrace(); }
fuente
Se puede hacer así
int totalMinutesInt = Integer.valueOf(totalMinutes.toString()); int hours = totalMinutesInt / 60; int hoursToDisplay = hours; if (hours > 12) { hoursToDisplay = hoursToDisplay - 12; } int minutesToDisplay = totalMinutesInt - (hours * 60); String minToDisplay = null; if(minutesToDisplay == 0 ) minToDisplay = "00"; else if( minutesToDisplay < 10 ) minToDisplay = "0" + minutesToDisplay ; else minToDisplay = "" + minutesToDisplay ; String displayValue = hoursToDisplay + ":" + minToDisplay; if (hours < 12) displayValue = displayValue + " AM"; else displayValue = displayValue + " PM"; return displayValue; } catch (Exception e) { LOGGER.error("Error while converting currency."); } return totalMinutes.toString();
fuente
long d1Ms=asa.getTime(); long d2Ms=asa2.getTime(); long minute = Math.abs((d1Ms-d2Ms)/60000); int Hours = (int)minute/60; int Minutes = (int)minute%60; stUr.setText(Hours+":"+Minutes);
fuente
Prueba este código:
import java.util.Scanner; public class BasicElement { public static void main(String[] args){ Scanner input = new Scanner(System.in); int hours; System.out.print("Enter the hours to convert:"); hours =input.nextInt(); int d=hours/24; int m=hours%24; System.out.println(d+"days"+" "+m+"hours"); } }
fuente
Dada la entrada en segundos, puede transformar al formato hh: mm: ss de esta manera:
int hours; int minutes; int seconds; int formatHelper; int input; //formatHelper maximum value is 24 hours represented in seconds formatHelper = input % (24*60*60); //for example let's say format helper is 7500 seconds hours = formatHelper/60*60; minutes = formatHelper/60%60; seconds = formatHelper%60; //now operations above will give you result = 2hours : 5 minutes : 0 seconds;
He usado formatHelper ya que la entrada puede ser de más de 86 400 segundos, que son 24 horas.
Si desea que el tiempo total de su entrada esté representado por hh: mm: ss, puede simplemente evitar formatHelper.
Espero que ayude.
fuente
Utilizo esta función para mis proyectos:
public static String minuteToTime(int minute) { int hour = minute / 60; minute %= 60; String p = "AM"; if (hour >= 12) { hour %= 12; p = "PM"; } if (hour == 0) { hour = 12; } return (hour < 10 ? "0" + hour : hour) + ":" + (minute < 10 ? "0" + minute : minute) + " " + p; }
fuente
(En Kotlin) Si va a poner la respuesta en un TextView o algo, puede usar un recurso de cadena:
<string name="time">%02d:%02d</string>
Y luego puede usar este recurso String para luego configurar el texto en tiempo de ejecución usando:
private fun setTime(time: Int) { val hour = time / 60 val min = time % 60 main_time.text = getString(R.string.time, hour, min) }
fuente
Aquí está mi función para convertir a
second
,millisecond
aday,hour,minute,second
public static String millisecondToFullTime(long millisecond) { return timeUnitToFullTime(millisecond, TimeUnit.MILLISECONDS); } public static String secondToFullTime(long second) { return timeUnitToFullTime(second, TimeUnit.SECONDS); } public static String timeUnitToFullTime(long time, TimeUnit timeUnit) { long day = timeUnit.toDays(time); long hour = timeUnit.toHours(time) % 24; long minute = timeUnit.toMinutes(time) % 60; long second = timeUnit.toSeconds(time) % 60; if (day > 0) { return String.format("%dday %02d:%02d:%02d", day, hour, minute, second); } else if (hour > 0) { return String.format("%d:%02d:%02d", hour, minute, second); } else if (minute > 0) { return String.format("%d:%02d", minute, second); } else { return String.format("%02d", second); } }
Pruebas
public static void main(String[] args) { System.out.println("60 => " + secondToFullTime(60)); System.out.println("101 => " + secondToFullTime(101)); System.out.println("601 => " + secondToFullTime(601)); System.out.println("7601 => " + secondToFullTime(7601)); System.out.println("36001 => " + secondToFullTime(36001)); System.out.println("86401 => " + secondToFullTime(86401)); }
Salida
60 => 1:00 101 => 1:41 601 => 10:01 7601 => 2:06:41 36001 => 10:00:01 86401 => 1day 00:00:01
Espero que ayude
fuente
Minutos mod 60 dará horas con minutos restantes.
http://www.cafeaulait.org/course/week2/15.html
fuente
se te olvida el piso en tu respuesta:
int hours = Math.floor(t / 60); int minutes = t % 60; System.out.printf("%d:%02d", hours, minutes);
sin él, su resultado es falso en ciertos casos como, por ejemplo:
t = 525 hours = 8.75
así que sin Math.floor tenemos este resultado: 9h45 en lugar de 8h45.
fuente
calcule los minutos usando este código:
long difference = new Date().getTime() - user.getUpdatedDate().getTime(); int minutes = (int) TimeUnit.MILLISECONDS.toMinutes(difference);
fuente
En Swift
func timeStringFrom(minutes:Double) -> String { return "\(Int(minutes/60)):\(Int(minutes) % 60)" }
fuente
int mHours = t / 60; //since both are ints, you get an int int mMinutes = t % 60; System.out.printf("%d:%02d", "" +mHours, "" +mMinutes);
fuente
import java.util.Scanner; public class Time{ public static void main(String[]args){ int totMins=0; int hours=0; int mins=0; Scanner sc= new Scanner(System.in); System.out.println("Enter the time in mins: "); totMins= sc.nextInt(); hours=(int)(totMins/60); mins =(int)(totMins%60); System.out.printf("%d:%d",hours,mins); } }
fuente