Wie konvertiere ich Millisekunden in das Datumsformat in Android?

98

Ich habe Millisekunden. Ich brauche es, um in das Datumsformat von konvertiert zu werden

Beispiel:

23/10/2011

Wie erreicht man das?

Pattabi Raman
quelle

Antworten:

204

Probieren Sie einfach diesen Beispielcode aus: -

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

Ich hoffe diese Hilfe ...

Uttam
quelle
Es funktioniert mit einem Wert von über 10 Ziffern, jedoch nicht mit einem Wert von 6 nach unten. Stunde haben einen Standard von 4 .. ???
Ralphgabb
5
Sie sollten ein neues SimpleDateFormat (dateFormat, Locale.US ( oder Ihr Gebietsschema )) anstelle des neuen SimpleDateFormat (dateFormat) verwenden , da dies aufgrund der Änderung der Standard-Android-Sprache
Amir Hossein Ghasemi
2
Zu Ihrer Information, die störenden alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormatsind jetzt Erbe, durch die verdrängte java.time Klassen. Ein Großteil der Funktionen von java.time wird im ThreeTen-Backport- Projekt auf Java 6 und Java 7 zurückportiert . Weiter angepasst für frühere Android im ThreeTenABP- Projekt. Siehe Verwendung von ThreeTenABP… .
Basil Bourque
@Uttam das funktioniert danke!, Aber ich hatte eine Frage. Sollten wir Uhrzeit und Datum in diesem Format "/ Date (1224043200000) /" erhalten? Ich habe gelesen, dass es ein altes JSON-Format von Microsoft ist und es nicht in neuen Entwicklungen verwendet werden sollte.
Aldor
78

Konvertieren Sie den Millisekundenwert in eine DateInstanz und übergeben Sie ihn an den ausgewählten Formatierer.

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

Rufen Sie diese Funktion auf

convertDate("82233213123","dd/MM/yyyy hh:mm:ss");
Atif Mahmood
quelle
2
Dank Mahmood erfordert diese Lösung API Level 1 (mein Projekt ist auf API 15 gesenkt), während andere Antworten API Level 24 (Datums- und / oder Kalenderbibliothek) erfordern
Steve Rogers
Was ist, wenn Sie Amerikaner sind?
siehe
12
DateFormat.getDateInstance().format(dateInMS);
axp
quelle
10

Versuchen Sie, diesen Code könnte helfen, ändern Sie ihn an Ihre Bedürfnisse

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

Ich finde endlich normalen Code, der für mich funktioniert

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
quelle
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

Der moderne Ansatz verwendet die java.time- Klassen, die die problematischen alten alten Datums- und Uhrzeitklassen ersetzen, die von allen anderen Antworten verwendet werden.

Angenommen, Sie haben longeinige Millisekunden seit dem Epochenbezug des ersten Augenblicks von 1970 in UTC, 1970-01-01T00: 00: 00Z…

Instant instant = Instant.ofEpochMilli( myMillisSinceEpoch ) ;

Um ein Datum zu erhalten, ist eine Zeitzone erforderlich. Für jeden Moment variiert das Datum weltweit je nach Zone.

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

Extrahieren Sie einen Nur-Datum-Wert.

LocalDate ld = zdt.toLocalDate() ;

Generieren Sie einen String, der diesen Wert im Standardformat ISO 8601 darstellt.

String output = ld.toString() ;

Generieren Sie einen String im benutzerdefinierten Format.

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

Tipp: Lassen Sie java.time automatisch für Sie lokalisieren, anstatt ein Formatierungsmuster fest zu codieren. Verwenden Sie die DateTimeFormatter.ofLocalized…Methoden.


Über java.time

Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie java.util.Date, Calendar, & SimpleDateFormat.

Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .

Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .

Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Strings, keine Notwendigkeit für java.sql.*Klassen.

Woher bekomme ich die java.time-Klassen?

Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden Interval, YearWeek, YearQuarter, und mehr .

Basil Bourque
quelle
5

Kurz und effektiv:

DateFormat.getDateTimeInstance().format(new Date(myMillisValue))
Alecs
quelle
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
quelle
Wir können es mit Time Unit machen ... aber es funktioniert nicht gut ... benutze dies ... das wird dir helfen ... es funktioniert gut
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
quelle
Verwenden Sie diese Methode, um das Datum im Zeichenfolgenformat wie 2016-08-18 oder eine beliebige Art im Zeichenfolgenformat in DateFormat zu konvertieren. Sie können das Datum auch in Millisekunden konvertieren.
Ravindra Rathour
2

Ich habe seit einiger Zeit nach einem effizienten Weg gesucht, dies zu tun, und das Beste, was ich gefunden habe, ist:

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

Vorteile:

  1. Es ist lokalisiert
  2. Seit API 1 in Android
  3. Sehr einfach

Nachteile:

  1. Begrenzte Formatoptionen. Zu Ihrer Information: KURZ ist nur ein zweistelliges Jahr.
  2. Sie brennen jedes Mal ein Datumsobjekt. Ich habe in der Quelle nach den anderen Optionen gesucht und dies ist im Vergleich zu ihrem Overhead ziemlich gering.

Sie können das Objekt java.text.DateFormat zwischenspeichern, es ist jedoch nicht threadsicher. Dies ist in Ordnung, wenn Sie es im UI-Thread verwenden.

Dustin
quelle
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);
}
backslashN
quelle
0

Verwenden Sie SimpleDateFormat für Android N und höher. Verwenden Sie den Kalender für frühere Versionen, zum Beispiel:

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

Ausgabe:
Dateiname vor: 2019-04-12-07: 14: 47  // SimpleDateFormat verwenden
Dateiname nach: 2019-4-12-7: 13: 12        // Kalender verwenden

ncinar
quelle
0

Dies ist der einfachste Weg mit 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
quelle
(1) Bitte bringen Sie den Jungen nicht bei, die lange veraltete und notorisch problematische SimpleDateFormatKlasse zu benutzen . Zumindest nicht als erste Option. Und das nicht ohne Vorbehalt. Heute haben wir so viel besser in java.timeder modernen Java-API für Datum und Uhrzeit und deren DateTimeFormatter. Ja, Sie können es auf Android verwenden. Verwenden Sie für ältere Android-Geräte das Desugaring oder lesen Sie die Verwendung von ThreeTenABP in Android Project .
Ole VV
(2) Ich glaube nicht, dass Sie Kleinbuchstaben beabsichtigt haben hh? Bitte überprüfen Sie hier den Unterschied zwischen Groß- und Kleinschreibung.
Ole VV
Der moderne Weg ist : return Instant.ofEpochMilli(millis).atZone(ZoneId.systemDefault()).format(DateTimeFormatter.ofPattern(DATE_FORMAT, Locale.US)). Ja, es ist länger, weil es mehr Informationen darüber gibt, was los ist, also ist es ein Vorteil.
Ole VV
-1

Sie können java.util.Date in Millisekunden erstellen. Und dann mit java.text.DateFormat in einen String konvertiert.

Vbif
quelle