2013-08-28 58 views
0

我有下面的代碼時區澄清的Java/Android的

public Long getEpochTime(String dateToGetItsEpoch) throws ParseException 
{ 
    TimeZone timeZone = TimeZone.getTimeZone("UTC"); 
    final String REQUEST_DATE_FORMAT = "dd/MM/yyyy h:m"; 

    DateFormat format = new SimpleDateFormat(REQUEST_DATE_FORMAT); 
    Date localDate = format.parse(dateToGetItsEpoch); 

    Calendar cal = Calendar.getInstance(timeZone); 
    cal.setTime(localDate); 

    format.setTimeZone(timeZone); 
    final String utcTime = format.format(cal.getTime()); 

    Date d = cal.getTime(); 

    return d.getTime(); 
} 

如果我改變我的設備,以任何語言環境,我總是得到UTC時間返回值。這是正確的,但是我想知道這是怎麼發生的?設備如何知道哪個時區是我給它的日期,以便相應計算?

回答

2

A Date根本沒有時區。 A SimpleDateFormat作爲解析和格式化的默認值;一個Calendar也是; Date沒有。

鑑於這樣的操作順序:

TimeZone timeZone = TimeZone.getTimeZone("UTC"); 
DateFormat format = new SimpleDateFormat(REQUEST_DATE_FORMAT); 
Date localDate = format.parse(dateToGetItsEpoch); 

Calendar cal = Calendar.getInstance(timeZone); 
cal.setTime(localDate); 

format.setTimeZone(timeZone); 
final String utcTime = format.format(cal.getTime()); 

...你最初使用該設備的默認時區解析字符串,那麼你格式化它在UTC。需要注意的是Calendar部分在這裏無關緊要 - 你會得到相同的結果有:

TimeZone timeZone = TimeZone.getTimeZone("UTC"); 
DateFormat format = new SimpleDateFormat(REQUEST_DATE_FORMAT); 
Date date = format.parse(dateToGetItsEpoch); 
format.setTimeZone(timeZone); 
final String utcTime = format.format(date); 

我個人推薦使用Joda Time在可能在Java中的日期/時間的工作,你要知道。這是一個比Calendar/Date更清潔的API。

+0

感謝您的及時回覆。如果我使用你建議的方法,我如何在新紀元中獲得新的UTC時間?並且關於您的線路'您最初使用設備的默認時區解析字符串'..我們是這樣做的嗎?日期localDate = format.parse(dateToGetItsEpoch);這是默認情況下發生的? – tony9099

+1

@ tony9099:我不知道你的意思是「新世界時代的新時代」。但是,是的,當您在'SimpleDateFormat'中未指定時區(或日曆)時調用'format.parse'時,它將使用默認時區。 –

+0

我的意思是,如果我沒有在日期內使用第二種建議的方法,我該如何將'utcTime'轉換爲紀元時間。 – tony9099