2014-09-01 58 views
0

我想00:00:00讓今天的UNIX時間戳(自01/01/1970秒鐘以後)與Java的日曆:獲得今天的UNIX時間戳和日曆

public long getTodayTimestamp() { 
    Calendar c = Calendar.getInstance(Locale.getDefault()); 
    c.setTimeInMillis(System.currentTimeMillis());  
    c.set( c.get(Calendar.YEAR), 
      c.get(Calendar.MONTH), 
      c.get(Calendar.DAY_OF_MONTH), 
      0, 0, 0 
    ); 
    return c.getTimeInMillis()/1000; 
} 

問題是,它返回1409608800今天(9月1日),但當我嘗試用一​​些轉換器(例如http://www.onlineconversion.com/unix_time.htm)轉換它時,我得到Mon, 01 Sep 2014 22:00:00 GMT這是當地時間9月2日午夜。基本上這個方法會在我需要的時間24小時前返回時間戳。

我在哪裏搞砸了?

+2

由於「問題」?爲什麼不能只使用'Date'或'System'? – chrylis 2014-09-01 21:56:35

+0

由於問題,我需要半個小時才能解釋。編輯:哎呀,對不起,那個部分是從問題有更廣泛的焦點時留下。當然,我可以使用日期或任何方法,但如何?在這種情況下爲什麼它比Calendar更好? – TimSim 2014-09-01 21:57:30

+1

您可以設置時區? (http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#getInstance%28java.util.TimeZone,%20java.util.Locale%29) – Tom 2014-09-01 22:00:16

回答

1

在線轉換器返回日期UTC + 0
你在TimeZone +2。
這意味着:22:00:00(UTC + 0)是00:00:00(UTC + 2)在你的時區
所以,當我沒有錯(我希望如此),一切似乎都是正確的。

編輯:
你的情況的問題:
方法getTodayTimestamp()返回在UTC的時間戳+ 0
(getCalendar.getTimeInMillis返回UTC + 0)
這意味着00:00: 00在您的區域設置(UTC + 2)是22:00:00,UTC + 0
這是轉換器顯示的內容!

在這裏看到:
http://docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#getTimeInMillis()

+0

但是這個方法應該會返回當天的開始,而不是第二天的開始。 – TimSim 2014-09-01 22:21:06

+0

看到我編輯的答案 – Ben 2014-09-01 22:35:29

0

就可以得到UNIX時間艱難地:-)

至少你不會有語言環境,奮鬥等

public class GetUnixTime { 
    public static void main(String[] args) throws IOException, 
      InterruptedException { 
     ProcessBuilder ps = new ProcessBuilder("date"); 
     ps.redirectErrorStream(true); 
     Process pr = ps.start(); 
     StringWriter sw = new StringWriter(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream())); 
     String line; 
     while ((line = in.readLine()) != null) { 
      sw.write(line); 
     } 
     pr.waitFor(); 
     in.close(); 
     sw.flush(); 
     sw.close(); 

     System.out.println(">"+sw.toString()+"<"); //parse this guy 
    } 
} 
+0

你將不得不努力與系統區域設置,你的程序將表現不同的一些環境變量,等等... – DThought 2014-09-02 06:23:48

0

answer by Ben似乎是正確的。

避免j.u.Calendar

日期 - 時間的工作是一個體面的庫,而不是臭名昭著的麻煩java.util.Date和.Calendar類容易得多。可以使用Joda-Time或Java 8中新的java.time包。這兩個庫都明確清晰地處理時區。

Joda-Time

Joda-Time中的示例2.4。

DateTime nowParis = DateTime.now(DateTimeZone.forID("Europe/Paris")); 
DateTime nowUtc = nowParis.withZone(DateTimeZone.UTC); 
long millisecondsSinceUnixEpoch = nowParis.getMillis(); // Some result when called on either nowParis or nowUtc. 
long secondsSinceUnixEpoch = (millisecondsSinceUnixEpoch/1000L); 

在這些DateTime對象上調用toString來驗證它們的值。

或在一行。

long secondsSinceUnixEpoch = (DateTime.now().getMillis()/1000L); 

由於我們只需要幾秒鐘,因爲當前時刻到來,時區並不重要。