como converter milissegundos para o formato de data no android?

99

Eu tenho milissegundos. Eu preciso que seja convertido para o formato de data de

exemplo:

23/10/2011

Como fazer isso?

Pattabi Raman
fonte

Respostas:

204

Experimente este código de amostra: -

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 ajude ...

Uttam
fonte
funciona com valores de mais de 10 dígitos, mas não com 6 para baixo. hora tem um padrão de 4 .. ???
ralphgabb
5
você deve usar o novo SimpleDateFormat (dateFormat, Locale.US ( ou seu local )) em vez do novo SimpleDateFormat (dateFormat) , porque isso causa travamento devido à alteração do idioma padrão do Android
Amir Hossein Ghasemi
2
FYI, os incômodos aulas em tempo data antigas, tais como java.util.Date, java.util.Calendare java.text.SimpleDateFormatestão agora legado, suplantado pelos java.time classes. Grande parte da funcionalidade java.time é portada para Java 6 e Java 7 no projeto ThreeTen-Backport . Adaptado para o Android anterior no projeto ThreeTenABP . Consulte Como usar o ThreeTenABP… .
Basil Bourque de
@Uttam isso funciona, obrigado !, Mas eu tinha uma pergunta. Devemos receber a hora e a data neste formato "/ Data (1224043200000) /"? Eu li que é um formato json antigo da Microsoft e não deve ser usado em novos desenvolvimentos.
Aldor
78

Converta o valor de milissegundos em Dateinstância e passe-o para o formatador escolhido.

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 
String dateString = formatter.format(new Date(dateInMillis)));
Príncipe John Wesley
fonte
36
public static String convertDate(String dateInMilliseconds,String dateFormat) {
    return DateFormat.format(dateFormat, Long.parseLong(dateInMilliseconds)).toString();
}

Chame esta função

convertDate("82233213123","dd/MM/yyyy hh:mm:ss");
Atif Mahmood
fonte
2
Obrigado Mahmood, esta solução requer API Nível 1 (meu projeto foi reduzido para API 15) enquanto outra Resposta requer API Nível 24 (Data e / ou biblioteca de calendário)
Steve Rogers
e se você for americano?
Behelit
12
DateFormat.getDateInstance().format(dateInMS);
axp
fonte
10

tente este código pode ajudar, modifique-o para atender às suas necessidades

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

finalmente encontrei um código normal que funciona para mim

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
John
fonte
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

A abordagem moderna usa as classes java.time que substituem as antigas e problemáticas classes de data e hora usadas por todas as outras respostas.

Supondo que você tenha longalguns milissegundos desde a referência de época do primeiro momento de 1970 no UTC, 1970-01-01T00: 00: 00Z ...

Instant instant = Instant.ofEpochMilli( myMillisSinceEpoch ) ;

Para obter uma data, é necessário um fuso horário. Para qualquer momento, a data varia ao redor do globo por zona.

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

Extraia um valor apenas de data.

LocalDate ld = zdt.toLocalDate() ;

Gere uma string representando esse valor usando o formato ISO 8601 padrão.

String output = ld.toString() ;

Gere uma String em formato personalizado.

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

Dica: considere deixar java.time localizar automaticamente para você em vez de codificar um padrão de formatação. Use os DateTimeFormatter.ofLocalized…métodos.


Sobre java.time

A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como java.util.Date, Calendar, e SimpleDateFormat.

O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time .

Para saber mais, consulte o tutorial Oracle . E pesquise no Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .

Você pode trocar objetos java.time diretamente com seu banco de dados. Use um driver JDBC compatível com JDBC 4.2 ou posterior. Não há necessidade de cordas, não há necessidade de java.sql.*classes.

Onde obter as classes java.time?

  • Java SE 8 , Java SE 9 e posterior
    • Construídas em.
    • Parte da API Java padrão com uma implementação agrupada.
    • Java 9 adiciona alguns recursos e correções menores.
  • Java SE 6 e Java SE 7
    • Grande parte da funcionalidade java.time é portada para Java 6 e 7 no ThreeTen-Backport .
  • Android
    • Versões posteriores de implementações de pacotes Android das classes java.time.
    • Para anteriormente Android (<26), o ThreeTenABP projeto adapta ThreeTen-Backport (mencionados acima). Consulte Como usar o ThreeTenABP… .

O projeto ThreeTen-Extra estende java.time com classes adicionais. Este projeto é um campo de provas para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como Interval, YearWeek, YearQuarter, e mais .

Basil Bourque
fonte
5

Curto e eficaz:

DateFormat.getDateTimeInstance().format(new Date(myMillisValue))
Alecs
fonte
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);

            }
        });
    }
}
Gaddam Nagaraju
fonte
Podemos fazer isso usando a unidade de tempo ... mas não funciona bem ... use isso ... isso irá ajudá-lo ... funciona bem
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();
}
Ravindra Rathour
fonte
Use estes métodos para converter a data em formato de string como 2016-08-18 ou qualquer tipo de formato de string para DateFormat e você também pode converter a data em milissegundos.
Ravindra Rathour
2

Há algum tempo procuro uma maneira eficiente de fazer isso e o melhor que encontrei é:

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

Vantagens:

  1. É localizado
  2. Estou no Android desde a API 1
  3. Muito simples

Desvantagens:

  1. Opções de formato limitadas. FYI: SHORT é apenas um ano de 2 dígitos.
  2. Você sempre queima um objeto Date. Eu olhei a fonte para as outras opções e isso é um pouco menor em comparação com suas despesas gerais.

Você pode armazenar em cache o objeto java.text.DateFormat, mas não é threadsafe. Isso está OK se você estiver usando no thread de interface do usuário.

Dustin
fonte
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);
}
barra invertida N
fonte
0

Use SimpleDateFormat para Android N e superior. Use o calendário para versões anteriores, por exemplo:

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);
    }

Saída:
fileName before: 2019-04-12-07: 14: 47  // use SimpleDateFormat
fileName after: 2019-4-12-7: 13: 12        // use Calender

ncinar
fonte
0

Esta é a maneira mais 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))
}
Kenny Orellana
fonte
(1) Por favor, não ensine os jovens a usar a SimpleDateFormatclasse há muito desatualizada e notoriamente problemática . Pelo menos não como primeira opção. E não sem reservas. Hoje temos muito melhor em java.time, a moderna API Java de data e hora e seus DateTimeFormatter. Sim, você pode usá-lo no Android. Para Android mais antigo, use desugaring ou consulte Como usar o ThreeTenABP no Android Project .
Ole VV
(2) Eu não acho que você pretendia minúsculas hh? Verifique a diferença entre maiúsculas e minúsculas aqui.
Ole VV
A maneira moderna é: return Instant.ofEpochMilli(millis).atZone(ZoneId.systemDefault()).format(DateTimeFormatter.ofPattern(DATE_FORMAT, Locale.US)). Sim, é mais longo porque dá mais informações sobre o que está acontecendo, então é uma vantagem.
Ole VV
-1

Você pode construir java.util.Date em milissegundos. E então o converteu em string com java.text.DateFormat.

Vbif
fonte