¿Cómo convertir milisegundos al formato de fecha en Android?


Respuestas:


206

Pruebe este código de muestra: -

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;


public class Test {

/**
 * Main Method
 */
public static void main(String[] args) {
    System.out.println(getDate(82233213123L, "dd/MM/yyyy hh:mm:ss.SSS"));
}


/**
 * Return date in specified format.
 * @param milliSeconds Date in milliseconds
 * @param dateFormat Date format 
 * @return String representing date in specified format
 */
public static String getDate(long milliSeconds, String dateFormat)
{
    // Create a DateFormatter object for displaying date in specified format.
    SimpleDateFormat formatter = new SimpleDateFormat(dateFormat);

    // Create a calendar object that will convert the date and time value in milliseconds to date. 
     Calendar calendar = Calendar.getInstance();
     calendar.setTimeInMillis(milliSeconds);
     return formatter.format(calendar.getTime());
}
}

Espero que esto ayude ...


Funciona con valores largos de más de 10 dígitos pero no con 6 hacia abajo. hora tiene un valor predeterminado de 4 .. ???
ralphgabb

5
debe usar el nuevo SimpleDateFormat (dateFormat, Locale.US ( o su configuración regional )) en lugar del nuevo SimpleDateFormat (dateFormat) , ya que causa un bloqueo debido al cambio del idioma predeterminado de Android
Amir Hossein Ghasemi

2
Para su información, las clases de fecha y hora viejas problemáticas tales como java.util.Date, java.util.Calendary java.text.SimpleDateFormatahora están legado, suplantados por los java.time clases. Gran parte de la funcionalidad java.time se ha actualizado a Java 6 y Java 7 en el proyecto ThreeTen-Backport . Más adaptado para Android anterior en el proyecto ThreeTenABP . Consulte Cómo utilizar ThreeTenABP… .
Basil Bourque

@Uttam esto funciona gracias !, pero tenía una pregunta. ¿Deberíamos recibir la hora y la fecha en este formato "/ Fecha (1224043200000) /"? He leído que es un formato json antiguo de microsoft y no debería usarse en nuevos desarrollos.
Aldor

79

Convierta el valor de milisegundos en Dateinstancia y páselo al formateador elegido.

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 
String dateString = formatter.format(new Date(dateInMillis)));

36
public static String convertDate(String dateInMilliseconds,String dateFormat) {
    return DateFormat.format(dateFormat, Long.parseLong(dateInMilliseconds)).toString();
}

Llamar a esta función

convertDate("82233213123","dd/MM/yyyy hh:mm:ss");

2
Gracias Mahmood, esta solución requiere API Nivel 1 (mi proyecto se redujo a API 15) mientras que otra Respuesta requiere API Nivel 24 (fecha y / o biblioteca de calendario)
Steve Rogers

¿y si eres americano?
behelit

12
DateFormat.getDateInstance().format(dateInMS);

10

probar este código puede ayudar, modifíquelo según sus necesidades

SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
Date d = format.parse(fileDate);

8

finalmente encuentro un código normal que funciona para mí

Long longDate = Long.valueOf(date);

Calendar cal = Calendar.getInstance();
int offset = cal.getTimeZone().getOffset(cal.getTimeInMillis());
Date da = new Date(); 
da = new Date(longDate-(long)offset);
cal.setTime(da);

String time =cal.getTime().toLocaleString(); 
//this is full string        

time = DateFormat.getTimeInstance(DateFormat.MEDIUM).format(da);
//this is only time

time = DateFormat.getDateInstance(DateFormat.MEDIUM).format(da);
//this is only date

6

tl; dr

Instant.ofEpochMilli( myMillisSinceEpoch )           // Convert count-of-milliseconds-since-epoch into a date-time in UTC (`Instant`).
    .atZone( ZoneId.of( "Africa/Tunis" ) )           // Adjust into the wall-clock time used by the people of a particular region (a time zone). Produces a `ZonedDateTime` object.
    .toLocalDate()                                   // Extract the date-only value (a `LocalDate` object) from the `ZonedDateTime` object, without time-of-day and without time zone.
    .format(                                         // Generate a string to textually represent the date value.
        DateTimeFormatter.ofPattern( "dd/MM/uuuu" )  // Specify a formatting pattern. Tip: Consider using `DateTimeFormatter.ofLocalized…` instead to soft-code the formatting pattern.
    )                                                // Returns a `String` object.

java.time

El enfoque moderno utiliza java.time clases que suplantan a las antiguas y problemáticas clases de fecha y hora heredadas utilizadas por todas las demás Respuestas.

Suponiendo que tiene longvarios milisegundos desde la referencia de época del primer momento de 1970 en UTC, 1970-01-01T00: 00: 00Z…

Instant instant = Instant.ofEpochMilli( myMillisSinceEpoch ) ;

Para obtener una fecha se requiere una zona horaria. En un momento dado, la fecha varía en todo el mundo según la zona.

ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;  // Same moment, different wall-clock time.

Extrae un valor de solo fecha.

LocalDate ld = zdt.toLocalDate() ;

Genere una cadena que represente ese valor utilizando el formato estándar ISO 8601.

String output = ld.toString() ;

Genere una cadena en formato personalizado.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ;
String output = ld.format( f ) ;

Consejo: considere dejar que java.time se localice automáticamente en lugar de codificar un patrón de formato. Usa los DateTimeFormatter.ofLocalized…métodos.


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 .

Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No se necesitan cuerdas, no se necesitan java.sql.*clases.

¿Dónde obtener las clases java.time?

  • Java SE 8 , Java SE 9 y posterior
    • Incorporado.
    • Parte de la API estándar de Java con una implementación integrada.
    • Java 9 agrega algunas funciones y correcciones menores.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de java.time está adaptada a Java 6 y 7 en ThreeTen-Backport .
  • Androide
    • Versiones posteriores de implementaciones de paquetes de Android de las clases java.time.
    • Para anteriormente Android (<26), el ThreeTenABP proyecto adapta ThreeTen-Backport (mencionado anteriormente). Consulte Cómo utilizar 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. Usted puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuarter, y más .


5

Corto y eficaz:

DateFormat.getDateTimeInstance().format(new Date(myMillisValue))

4
public class LogicconvertmillistotimeActivity extends Activity {
    /** Called when the activity is first created. */
     EditText millisedit;
        Button   millisbutton;
        TextView  millistextview;
        long millislong;
        String millisstring;
        int millisec=0,sec=0,min=0,hour=0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        millisedit=(EditText)findViewById(R.id.editText1);
        millisbutton=(Button)findViewById(R.id.button1);
        millistextview=(TextView)findViewById(R.id.textView1);
        millisbutton.setOnClickListener(new View.OnClickListener() {            
            @Override
            public void onClick(View v) {   
                millisbutton.setClickable(false);
                millisec=0;
                sec=0;
                min=0;
                hour=0;
                millisstring=millisedit.getText().toString().trim();
                millislong= Long.parseLong(millisstring);
                Calendar cal = Calendar.getInstance();
                SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
                if(millislong>1000){
                    sec=(int) (millislong/1000);
                    millisec=(int)millislong%1000;
                    if(sec>=60){
                        min=sec/60;
                        sec=sec%60;
                    }
                    if(min>=60){
                        hour=min/60;
                        min=min%60;
                    }
                }
                else
                {
                    millisec=(int)millislong;
                }
                cal.clear();
                cal.set(Calendar.HOUR_OF_DAY,hour);
                cal.set(Calendar.MINUTE,min);
                cal.set(Calendar.SECOND, sec);
                cal.set(Calendar.MILLISECOND,millisec);
                String DateFormat = formatter.format(cal.getTime());
//              DateFormat = "";
                millistextview.setText(DateFormat);

            }
        });
    }
}

Podemos hacerlo usando la unidad de tiempo ... pero no funciona bien ... usa esto ... esto te ayudará ... funciona bien
gaddam nagaraju

2
    public static Date getDateFromString(String date) {

    Date dt = null;
    if (date != null) {
        for (String sdf : supportedDateFormats) {
            try {
                dt = new Date(new SimpleDateFormat(sdf).parse(date).getTime());
                break;
            } catch (ParseException pe) {
                pe.printStackTrace();
            }
        }
    }
    return dt;
}

public static Calendar getCalenderFromDate(Date date){
    Calendar cal =Calendar.getInstance();
    cal.setTime(date);return cal;

}
public static Calendar getCalenderFromString(String s_date){
    Date date = getDateFromString(s_date);
    Calendar cal = getCalenderFromDate(date);
    return cal;
}

public static long getMiliSecondsFromString(String s_date){
    Date date = getDateFromString(s_date);
    Calendar cal = getCalenderFromDate(date);
    return cal.getTimeInMillis();
}

Utilice este método para convertir la fecha en formato de cadena como 2016-08-18 o cualquier tipo de formato de cadena a DateFormat y también puede convertir la fecha en milisegundos.
Ravindra Rathour

2

He estado buscando una forma eficiente de hacer esto durante bastante tiempo y lo mejor que he encontrado es:

DateFormat.getDateInstance(DateFormat.SHORT).format(new Date(millis));

Ventajas:

  1. Esta localizado
  2. Estado en Android desde API 1
  3. Muy simple

Desventajas:

  1. Opciones de formato limitadas. FYI: SHORT es solo un año de 2 dígitos.
  2. Grabas un objeto Date cada vez. He buscado en la fuente las otras opciones y esta es bastante menor en comparación con sus gastos generales.

Puede almacenar en caché el objeto java.text.DateFormat, pero no es seguro para subprocesos. Esto está bien si lo está utilizando en el hilo de la interfaz de usuario.


1
public static String toDateStr(long milliseconds, String format)
{
    Date date = new Date(milliseconds);
    SimpleDateFormat formatter = new SimpleDateFormat(format, Locale.US);
    return formatter.format(date);
}

1

Esta es la forma más fácil de usar Kotlin

private const val DATE_FORMAT = "dd/MM/yy hh:mm"

fun millisToDate(millis: Long) : String {
    return SimpleDateFormat(DATE_FORMAT, Locale.US).format(Date(millis))
}

(1) Por favor, no enseñe a los jóvenes a usar la SimpleDateFormatclase obsoleta y notoriamente problemática . Al menos no como primera opción. Y no sin reserva alguna. Hoy tenemos mucho mejor en java.time, la API moderna de fecha y hora de Java, y su DateTimeFormatter. Sí, puedes usarlo en Android. Para Android más antiguo, use desugaring o vea Cómo usar ThreeTenABP en Android Project .
Ole VV

(2) ¿No creo que pretendías usar minúsculas hh? Compruebe aquí la diferencia entre mayúsculas y minúsculas.
Ole VV

La forma moderna es: return Instant.ofEpochMilli(millis).atZone(ZoneId.systemDefault()).format(DateTimeFormatter.ofPattern(DATE_FORMAT, Locale.US)). Sí, es más largo porque brinda más información sobre lo que está sucediendo, por lo que es una ventaja.
Ole VV

0

Utilice SimpleDateFormat para Android N y superior. Utilice el calendario para versiones anteriores, por ejemplo:

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        fileName = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss").format(new Date());
        Log.i("fileName before",fileName);
    }else{
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MONTH,1);
        String zamanl =""+cal.get(Calendar.YEAR)+"-"+cal.get(Calendar.MONTH)+"-"+cal.get(Calendar.DAY_OF_MONTH)+"-"+cal.get(Calendar.HOUR_OF_DAY)+":"+cal.get(Calendar.MINUTE)+":"+cal.get(Calendar.SECOND);

        fileName= zamanl;
        Log.i("fileName after",fileName);
    }

Salida:
fileName antes: 2019-04-12-07: 14: 47  // use SimpleDateFormat
fileName después: 2019-4-12-7: 13: 12        // use Calender


-1

Puede construir java.util.Date en milisegundos. Y luego lo convirtió en cadena con java.text.DateFormat.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.