2012-01-11 45 views
15

Tôi có một Chuỗi 00:01:30.500 tương đương với 90500 mili giây. Tôi đã thử sử dụng SimpleDateFormat cung cấp cho mili giây kể cả ngày hiện tại. Tôi chỉ cần chuỗi đại diện đến mili giây. Tôi có phải viết phương thức tùy chỉnh, phương thức này sẽ tách và tính mili giây không? hoặc có cách nào khác để làm điều này? Cảm ơn.Làm thế nào để chuyển đổi HH: mm: ss.SSS thành mili giây?

Tôi đã thử như sau:

 String startAfter = "00:01:30.555"; 
     SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss.SSS"); 
     Date date = dateFormat.parse(startAfter); 
     System.out.println(date.getTime()); 
+0

Bạn đã sử dụng mẫu hình nào để tạo SimpleDateFormat? Bạn có thể gửi mã không? –

Trả lời

31

Bạn có thể sử dụng SimpleDateFormat để làm điều đó. Bạn chỉ cần biết 2 điều.

  1. Tất cả các ngày được nội đại diện trong UTC
  2. .getTime() trả về số mili giây kể từ 1970/01/01 00:00:00 UTC.
package se.wederbrand.milliseconds; 

import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.TimeZone; 

public class Main {   
    public static void main(String[] args) throws Exception { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
     sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 

     String inputString = "00:01:30.500"; 

     Date date = sdf.parse("1970-01-01 " + inputString); 
     System.out.println("in milliseconds: " + date.getTime());   
    } 
} 
+1

Không cần phải thêm yyyy-MM-dd và 1970-01-01. Phân tích cú pháp như OP đã hoạt động nếu múi giờ được đặt thành GMT. –

+0

@JBNizet đúng và là một điểm tốt. Tôi cố tình đưa vào thông tin ngày tháng thêm vì tôi nghĩ nó tốt hơn cho thấy những gì đang diễn ra. –

+0

@AndreasWederbrand: "Bí quyết" mà làm cho nó hoạt động ở đây là để thiết lập ngày 1 tháng 1 năm 1970. Nhưng Giả sử Nếu tôi không cung cấp cho ngày này, sau đó nó sẽ làm việc? –

2

Nếu bạn muốn sử dụng SimpleDateFormat, bạn có thể viết:

private final SimpleDateFormat sdf = 
    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
    { sdf.setTimeZone(TimeZone.getTimeZone("GMT")); } 

private long parseTimeToMillis(final String time) throws ParseException 
    { return sdf.parse("1970-01-01 " + time).getTime(); } 

Nhưng một phương pháp tùy chỉnh sẽ hiệu quả hơn. SimpleDateFormat, vì tất cả hỗ trợ lịch, hỗ trợ múi giờ, hỗ trợ ban ngày-tiết kiệm thời gian, v.v., khá chậm. Sự chậm chạp là giá trị nó nếu bạn thực sự cần một số các tính năng, nhưng kể từ khi bạn không, nó có thể không được. (Tùy thuộc vào mức độ thường xuyên bạn gọi phương pháp này và liệu hiệu quả có phải là mối quan ngại đối với đơn đăng ký của bạn hay không.)

Ngoài ra, SimpleDateFormat không an toàn. (Nếu không biết gì về ứng dụng của bạn, tôi không thể đoán được điều đó có quan trọng không.)

Cá nhân, tôi có thể viết một phương pháp tùy chỉnh.

+0

Không cần phải thêm yyyy-MM-dd và 1970-01-01. Phân tích cú pháp như OP đã hoạt động nếu múi giờ được đặt thành GMT. –

+0

@JBNizet: Trên hệ thống của tôi là sự thật, nhưng OP đã viết rằng cách tiếp cận của anh/cô ấy đã cho "mili giây bao gồm ngày hiện tại", vì vậy tôi giả sử rằng việc JDK của anh ta/cô ấy thực hiện 'SimpleDateFormat' không được gọi' calendar.clear () '. Tôi không thấy bất cứ điều gì trong Javadoc chỉ ra rằng 'SimpleDateFormat' phải mặc định là 1970-01-01. Bạn có biết nếu điều đó được đảm bảo không? – ruakh

1

Sử dụng JODA:

PeriodFormatter periodFormat = new PeriodFormatterBuilder() 
    .minimumParsedDigits(2) 
    .appendHour() // 2 digits minimum 
    .appendSeparator(":") 
    .minimumParsedDigits(2) 
    .appendMinute() // 2 digits minimum 
    .appendSeparator(":") 
    .minimumParsedDigits(2) 
    .appendSecond() 
    .appendSeparator(".") 
    .appendMillis3Digit() 
    .toFormatter(); 
Period result = Period.parse(string, periodFormat); 
return result.toStandardDuration().getMillis(); 
3

Nếu bạn muốn phân tích định dạng bản thân bạn có thể làm điều đó một cách dễ dàng với một regex như

private static Pattern pattern = Pattern.compile("(\\d{2}):(\\d{2}):(\\d{2}).(\\d{3})"); 

public static long dateParseRegExp(String period) { 
    Matcher matcher = pattern.matcher(period); 
    if (matcher.matches()) { 
     return Long.parseLong(matcher.group(1)) * 3600000L 
      + Long.parseLong(matcher.group(2)) * 60000 
      + Long.parseLong(matcher.group(3)) * 1000 
      + Long.parseLong(matcher.group(4)); 
    } else { 
     throw new IllegalArgumentException("Invalid format " + period); 
    } 
} 

Tuy nhiên, phân tích này là khá nhân hậu và sẽ chấp nhận 99 : 99: 99.999 và chỉ để cho các giá trị tràn. Đây có thể là một nhược điểm hoặc một tính năng.

+0

Hey tôi đã sử dụng cách tiếp cận của bạn nhưng nó cho kết quả với một nhân vật được thêm vào, là do L bạn đã sử dụng với 3600000 – Prateek

+0

Có lẽ không, L là để làm cho nó một thời gian dài. Phần nào cho kết quả bằng -? DateParseRegExp trả về giá trị dài không có - (trừ khi nó âm). Đây có phải là một trong những nhóm phù hợp có -? –

+0

OOPS không phải vì L của tôi xấu. – Prateek

Các vấn đề liên quan