2016-03-23 25 views
2

Benim java'mda (aslında, Android, ama bu konuyla alakasız) proje, kullanıcı bazı etkinlikler için başlangıç ​​ve bitiş zamanı girebilir ve sistem otomatik olarak süreyi hesaplar. Düğmesine basın, geçerli zaman damgasını almak için System.currentTimeMillis() kullanın.Uzun zaman damgasından saf bir zaman unsuru elde etme

Bu sorunun kapsamı dışındaki nedenlerden ötürü, zaman damgasının tarih bölümünü atmam ve yalnızca bir saati saklamam gerekiyor. Kolay, diye düşündüm, sadece bir günde milisaniye sayısına göre böler ve kalanı atın:

Bu neredeyse eser
long currentTimestamp = System.currentTimeMillis(); 
long timeOnly = currentTimeStamp % (1000 * 60 * 60 * 24); 

- bu zaman damgası bir saat kapalı üretir hariç. İşte bir örnek:

DateFormat timeFormat = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.US); 
long currentTimestamp = System.currentTimeMillis(); 
long timeOnly = currentTimestamp % (1000 * 60 * 60 * 24); 
System.out.println("Full value: " + timeFormat.format(currentTimestamp)); 
System.out.println("Time only: " + timeFormat.format(timeOnly)); 

Bu kod baskılar:

Full value: 10:53 PM 
Time only: 11:53 PM 


Full value: 11:19 PM 
Time only: 12:19 AM 

Sadece damgası itibaren bir saat çıkarma mümkün olmakla birlikte, aslında bu oluyor sebebini anlamak istiyorum.

+0

Emin değilim ... ama sezgilerimin bana saat dilimi ile ilgili bir şey olduğunu söyledi. Şunu kontrol edeyim - şu anda DTS'deyiz ... bu, saati açıklar :). CurrentTimeMillis, bir UNIX zaman damgasıdır (UTC’de hesabınız çalışırdı ...). Geri döneceğim :) – Philipp

+0

Kendimi Birleşik Krallık'ta olduğumu ve henüz DST'de olmadığımızı belirterek değer. 'Locale.UK' –

+0

add 'timeFormat.setTimeZone (TimeZone.getTimeZone (" UTC ")) 'yi kullanırsam, bende aynı sonucu alırım;' ve farkın olmayacak ... bu kesin bir zaman dilimi problemidir :). 'Yerel Ayar' sadece biçimlendirme içindir, saat dilimini değil. – Philipp

cevap

0

Dene:

Calendar calendar = Calendar.getInstance(); 
    calendar.setTime(new Date(System.currentTimeMillis())); 
    calendar.set(Calendar.MONTH, 0); 
    calendar.set(Calendar.YEAR, 0); 
    calendar.set(Calendar.DAY_OF_MONTH, 0); 

    System.out.println("Full value: " + timeFormat.format(currentTimestamp)); 
    System.out.println("Time only: " + timeFormat.format(calendar.getTimeInMillis())); 

Calendar örneği Timezone mevcut kullanacak ve tüm belirleyiciler dikkate değiştireceğim zaman dilimini alacaktır. Böylece, çalışması gerekir.

Not: Bunu yapmak istiyorum neden

soru kalır. Sadece 'tam tarih' saklanmak yerine, zaman bilgisini bir veritabanında saklamak ister misiniz? Bunu yapmak isterseniz, geçerli yerel saatinizi bir UTC saatine (currentTimeMillis() kullanmak yerine harita yapabilirsiniz.

+0

Tamam, tarih 0/0/0 olarak ayarlanıyor. Tarih bölümünün kaldırılmasının nedeni, seçilen sürenin nasıl değiştirileceğidir. Zamana göre değişiklik yapmak için kullanılan UI, yalnızca zamanı gösterir, ancak güncellendiği tarihin tarihi/saati ile günceller. Başka bir tarihte güncellenirse, 1 saat ara yerine, 1 gün artı 1 saat ile sonuçlanacağım - bu yüzden her şeyi aynı güne normalleştirmem gerekiyor. En kolay, tarihi kaldırmaktır. –

+0

"Takvim" uygulaması ile çalışmalı ve Java 8 kullanıyorsanız, http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html ve http://www.oracle.com/technetwork/articles/java/jf14 : //stackoverflow.com/questions/29750221/is-joda-time-deprecated-with-java-8-date-and-time-api-java-time – Philipp

+0

Eh, java 8 bir seçenek değil, Özellikle Android 4.2.2 aygıtları için yazıyor (iç istemcinin mülkü) –

İlgili konular