làm thế nào để chuyển đổi mili giây sang định dạng ngày tháng trong Android?


99

Tôi có mili giây. Tôi cần nó được chuyển đổi sang định dạng ngày của

thí dụ:

23/10/2011

Làm thế nào để đạt được nó?

Câu trả lời:


204

Chỉ cần thử mã mẫu này: -

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

Tôi hy vọng điều này sẽ giúp ...


nó hoạt động trên giá trị dài hơn 10 chữ số nhưng không hoạt động trên 6 chữ số xuống. giờ có mặc định là 4 .. ???
ralphgabb

5
bạn nên sử dụng SimpleDateFormat mới (DateFormat, Locale.US ( hoặc miền địa phương của bạn )) thay vì SimpleDateFormat mới (DateFormat) , bởi vì nó nguyên nhân sụp đổ do sự thay đổi ngôn ngữ mặc định android
Amir Hossein Ghasemi

2
FYI, người già lớp ngày thời gian phiền hà như java.util.Date, java.util.Calendarjava.text.SimpleDateFormatbây giờ là di sản, thay thế bởi sự java.time lớp. Phần lớn chức năng java.time được chuyển ngược sang Java 6 & Java 7 trong dự án ThreeTen-Backport . Được điều chỉnh thêm cho Android trước đó trong dự án ThreeTenABP . Xem Cách sử dụng ThreeTenABP… .
Basil Bourque,

@Uttam này hoạt động, cảm ơn !, Nhưng tôi có một câu hỏi. Chúng ta có nên nhận ngày và giờ ở định dạng "/ Date (1224043200000) /" này không? Tôi đã đọc rằng định dạng json cũ của microsoft và nó không nên được sử dụng trong quá trình phát triển mới.
Aldor

78

Chuyển đổi giá trị mili giây thành Dateví dụ và chuyển nó đến trình định dạng đã chọn.

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

Gọi hàm này

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

2
Cảm ơn Mahmood, giải pháp này đòi hỏi phải có API Level 1 (dự án của tôi được hạ xuống đến API 15) trong khi trả lời khác yêu cầu API Level 24 (Ngày và / hoặc thư viện Lịch)
Steve Rogers

nếu bạn là người Mỹ thì sao?
behelit

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

10

hãy thử mã này có thể hữu ích, sửa đổi nó phù hợp với nhu cầu của bạn

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

8

cuối cùng tôi cũng tìm thấy mã bình thường phù hợp với tôi

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

Cách tiếp cận hiện đại sử dụng các lớp java.time thay thế các lớp ngày-giờ kế thừa cũ rắc rối được sử dụng bởi tất cả các Câu trả lời khác.

Giả sử bạn có một longsố mili giây kể từ tham chiếu kỷ nguyên của thời điểm đầu tiên của năm 1970 theo giờ UTC, 1970-01-01T00: 00: 00Z…

Instant instant = Instant.ofEpochMilli( myMillisSinceEpoch ) ;

Để có được một ngày yêu cầu một múi giờ. Đối với bất kỳ thời điểm nhất định nào, ngày thay đổi trên toàn cầu theo khu vực.

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

Trích xuất một giá trị chỉ ngày.

LocalDate ld = zdt.toLocalDate() ;

Tạo Chuỗi đại diện cho giá trị đó bằng định dạng ISO 8601 tiêu chuẩn.

String output = ld.toString() ;

Tạo một chuỗi ở định dạng tùy chỉnh.

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

Mẹo: Hãy cân nhắc để java.time tự động bản địa hóa cho bạn thay vì viết mã cứng một mẫu định dạng. Sử dụng các DateTimeFormatter.ofLocalized…phương pháp.


Giới thiệu về java.time

Các java.time khung được xây dựng vào Java 8 và sau đó. Những lớp học thay thế cái cũ phiền hà di sản lớp học ngày thời gian như java.util.Date, Calendar, & SimpleDateFormat.

Các Joda thời gian dự án, bây giờ trong chế độ bảo trì , khuyên chuyển đổi sang các java.time lớp.

Để tìm hiểu thêm, hãy xem Hướng dẫn Oracle . Và tìm kiếm Stack Overflow để có nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310 .

Bạn có thể trao đổi các đối tượng java.time trực tiếp với cơ sở dữ liệu của mình. Sử dụng trình điều khiển JDBC tương thích với JDBC 4.2 trở lên. Không cần chuỗi, không cần java.sql.*lớp.

Lấy các lớp java.time ở đâu?

  • Java SE 8 , Java SE 9 và mới hơn
    • Được xây dựng trong.
    • Một phần của API Java tiêu chuẩn với triển khai theo gói.
    • Java 9 bổ sung một số tính năng nhỏ và các bản sửa lỗi.
  • Java SE 6 Java SE 7
    • Phần lớn chức năng của java.time được chuyển ngược sang Java 6 & 7 trong ThreeTen-Backport .
  • Android
    • Các phiên bản triển khai gói Android mới hơn của các lớp java.time.
    • Đối với Android trước đó (<26), các ThreeTenABP dự án thích nghi ThreeTen-backport (nêu trên). Xem Cách sử dụng ThreeTenABP… .

Các ThreeTen-Extra dự án mở rộng java.time với các lớp bổ sung. Dự án này là cơ sở chứng minh cho những bổ sung có thể có trong tương lai cho java.time. Bạn có thể tìm thấy một số các lớp học hữu ích ở đây chẳng hạn như Interval, YearWeek, YearQuarter, và nhiều hơn nữa .


5

Ngắn gọn và hiệu quả:

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

            }
        });
    }
}

Chúng ta có thể làm điều đó bằng cách sử dụng Time Unit..but nó không làm việc this..this tốt ... sử dụng sẽ giúp you..it hoạt động tốt
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();
}

Sử dụng phương pháp này để chuyển đổi ngày ở định dạng chuỗi như 2016-08-18 hoặc bất kỳ loại nào ở định dạng chuỗi thành DateFormat và bạn cũng có thể chuyển đổi ngày thành mili giây.
Ravindra Rathour

2

Tôi đã tìm kiếm một cách hiệu quả để làm điều này trong một thời gian khá dài và cách tốt nhất mà tôi tìm thấy là:

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

Ưu điểm:

  1. Nó được bản địa hóa
  2. Đã có trong Android kể từ API 1
  3. Rất đơn giản

Nhược điểm:

  1. Tùy chọn định dạng hạn chế. FYI: NGẮN chỉ là năm có 2 chữ số.
  2. Bạn ghi một đối tượng Date mỗi lần. Tôi đã xem xét nguồn cho các tùy chọn khác và đây là một con số khá nhỏ so với chi phí của chúng.

Bạn có thể cache đối tượng java.text.DateFormat, nhưng nó không phải là threadsafe. Điều này là OK nếu bạn đang sử dụng nó trên chuỗi giao diện người dùng.


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

0

Sử dụng SimpleDateFormat cho Android N trở lên. Sử dụng lịch cho các phiên bản cũ hơn, ví dụ:

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

Đầu ra:
fileName trước: 2019-04-12-07: 14: 47  // sử dụng
tệp SimpleDateFormat Tên sau: 2019-4-12-7: 13: 12        // sử dụng Calender


0

Đây là cách dễ nhất khi sử dụng 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) Xin đừng dạy những người trẻ tuổi sử dụng SimpleDateFormatlớp học đã lỗi thời và khét tiếng phiền phức . Ít nhất không phải là tùy chọn đầu tiên. Và không phải không có bất kỳ đặt trước. Ngày nay, chúng ta có rất nhiều thứ tốt hơn java.time, API ngày giờ hiện đại của Java và nó DateTimeFormatter. Có, bạn có thể sử dụng nó trên Android. Đối với Android cũ hơn, hãy sử dụng tính năng gỡ bỏ hoặc xem Cách sử dụng ThreeTenABP trong Android Project .
Ole VV

(2) Tôi không nghĩ rằng bạn có ý định viết thường hh? Vui lòng kiểm tra sự khác biệt giữa chữ hoa và chữ thường tại đây.
Ole VV

Cách hiện đại là: return Instant.ofEpochMilli(millis).atZone(ZoneId.systemDefault()).format(DateTimeFormatter.ofPattern(DATE_FORMAT, Locale.US)). Có, nó dài hơn vì nó cung cấp thêm thông tin về những gì đang diễn ra, vì vậy đó là một lợi thế.
Ole VV

-1

Bạn có thể tạo java.util.Date trên mili giây. Và sau đó chuyển đổi nó thành chuỗi với java.text.DateFormat.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.