簡體   English   中英

兩個單獨的getTime()調用在不同時間返回相同的值

[英]Two Separate getTime() Calls Return Same Value at Different Times

我正在制作一個可以在用戶輸入位置並退出時保存的應用程序。 我必須為此分離Date對象。 當我打印出這些值時,盡管它們保存在不同的時間,但它們返回的准確時間相同。 任何想法可能是什么原因造成的?

我的checkLocation()方法:

private void checkLocation() {
            float[] distance = new float[2];
            for(int i = 1; i <= AssetLoader.getTotalLocations(); i++) {
                float mItemLat = AssetLoader.getItemLatitude(String.valueOf(i));
                float mItemLong = AssetLoader.getItemLongitude(String.valueOf(i));

                Location.distanceBetween(mLastLocation.getLatitude(), mLastLocation.getLongitude(),
                        mItemLat, mItemLong, distance);

                if(distance[0] > 55){
                    Toast.makeText(getBaseContext(), "Outside, distance from center: " + distance[0] + " radius: " + "55", Toast.LENGTH_LONG).show();
                    if(startDate != null) {
                        stopDate = calendar.getTime();
                        Log.e("STOP DATE", "SAVED");
                        saveTimeDifference(startDate, stopDate, String.valueOf(i));
                    }
                } else {
                    Toast.makeText(getBaseContext(), "Inside, distance from center: " + distance[0] + " radius: " + "55", Toast.LENGTH_LONG).show();
                    if(startDate == null) {
                        startDate = calendar.getTime();
                        Log.e("START DATE", "SAVED");
                    }
                }
            }
        }

計算時差和其他東西的地方:

public static void saveTimeDifference(Date startDate, Date endDate, String id) {
        //TODO: FIX THIS

        //milliseconds
        long difference = endDate.getTime() - startDate.getTime();
        AssetLoader.setItemTimeDifference(id, difference);

        System.out.println("startDate : " + startDate);
        System.out.println("endDate : "+ endDate);
        System.out.println("difference : " + difference);

        long secondsInMilli = 1000;
        long minutesInMilli = secondsInMilli * 60;
        long hoursInMilli = minutesInMilli * 60;
        long daysInMilli = hoursInMilli * 24;

        long elapsedDays = difference / daysInMilli;
        difference = difference % daysInMilli;

        long elapsedHours = difference / hoursInMilli;
        difference = difference % hoursInMilli;

        long elapsedMinutes = difference / minutesInMilli;
        difference = difference % minutesInMilli;

        long elapsedSeconds = difference / secondsInMilli;

        Log.e("saveTimeDifference()", elapsedDays + " days, " + elapsedHours + " hours, " + elapsedMinutes + " minutes, " + elapsedSeconds + " seconds");

        AssetLoader.setItemDetails(AssetLoader.getItemName(String.valueOf(id)), AssetLoader.getItemDetails(AssetLoader.getItemName(String.valueOf(id))) + "\nStart Date: " + startDate + " Stop Date: " + startDate);

    }

請注意, 當前時間是在不同時間訪問的 在GregorianCalendar對象上調用getTime()時,似乎將其保存為錯誤或返回了錯誤的時間。

感謝您的任何建議!

calendar.getTime()返回當前存儲在Calendar對象中的時間的java.util.Date對象。

Calendar最初通過調用獲得Calendar.getInstance()或其它裝置),它具有“當前時間”。

5小時后仍會是同一時間。 這不是“實時”時間,因此多次調用calendar.getTime()將獲得相同的值。

如果要捕獲當前時間,只需調用new Date()

Date startDate = new Date();
// do work
Date stopDate = new Date();
long difference = endDate.getTime() - startDate.getTime();
System.out.println("Work took " + difference + "ms");

Andreas接受的答案是正確的。

java.time

如果您要進行更多的日期時間工作,請考慮使用新的java.time框架來代替麻煩的舊日期時間類。

世界標准時間

要以UTC的時間獲取當前時間在UTC上的時間,以納秒為單位 ,請使用Instant

Instant now = Instant.now();

不變的對象

java.time中的類使用不可變對象模式。 每個實例的值從不改變(從不“變異”)。 因此,當您想再次了解當前時刻時,請再次調用Instant.now來創建Instant另一個實例。

解析度

在Java 8中,當前時刻以最高達毫秒的分辨率捕獲,而不是該類處理納秒的能力。 此限制是由於使用Clock的舊版實現。 在Java 9中,新的Clock實現可根據計算機的硬件時鍾以高達完整的納秒分辨率捕獲當前時刻。

划區

盡管通常最好將日期時間值存儲在UTC中 ,但為了進行演示,您可能希望在用戶期望的時區中顯示這些值。

要將Instant調整為特定的時鍾時間 ,請應用時區( ZoneId )。 指定正確的時區名稱 ,不要使用3-4字母的縮寫,例如ESTIST

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( now , zoneId );

過去

要以天-小時-分鍾-秒為單位跟蹤經過的時間跨度,請使用Duration類。 作為文本表示形式,此類使用一個標准的ISO 8601格式(例如PT1H30M解析並生成字符串一個半小時。

Duration duration = Duration.between( startInstant , stopInstant );
String output = duration.toString();

您可以在此時間范圍內獲得納秒,秒,分鍾或小時或天的總數。

奇怪的是,Java 8中的Duration類缺少方便地查詢天數,小時數,分鍾數和秒數的方法。 Java 9帶來了這種方法

對於年月日中的時間跨度,請使用Period類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM