2017-03-09 61 views
0

我正在研究一個將顯示活動列表的android應用程序。每個活動(即運行)都有一個財產日期(即3月9日8:58 2017)。我在屏幕上有兩個按鈕 - 每日和每週,我想在兩者之間切換並相應地更改列表。現在,對於每日清單,我不必更改任何內容,因爲每天都會創建一個新的活動。日期到相應星期的組列表? [Java]

但是,我不知道如何去每週列表。它基本上會計算統計數據(將各個星期的統計數據相加)。任何想法,將不勝感激。

例如,我有過去50天的日期列表。如何區分將代表個人星期的日期的單獨列表,以便我可以構建星期列表?基本上,轉換的50日到其周當量(例如,約7周)

這是我試圖日期的測試列表獲得第一份工作:

HashMap<Integer,Date> dateHashMap = new HashMap<>(); 

    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); 
    List<Date> dates = new ArrayList<>(); 


    dates.add(sdf.parse("10/03/2017")); 
    dates.add(sdf.parse("9/03/2017")); 
    dates.add(sdf.parse("8/03/2017")); 
    dates.add(sdf.parse("7/03/2017")); 
    dates.add(sdf.parse("6/03/2017")); 

    dates.add(sdf.parse("23/02/2017")); 
    dates.add(sdf.parse("3/02/2017")); 

    dates.add(sdf.parse("2/02/2017")); 
    dates.add(sdf.parse("1/02/2017")); 


    for(Date d:dates){ 

     dateHashMap.put(d.getDay(),d); 
    } 

    System.out.println(dateHashMap.toString()); 

爲例UI設計,我努力實現: enter image description here

+1

對於每週視圖,您可以使用相同的活動並顯示活動時間框架或任何您擁有的活動。並參考您可以看看谷歌健身應用程序或Mi Fit應用程序.. – shadygoneinsane

+0

@shadygoneinsane感謝您的建議。這是我無法弄清楚該怎麼做的一點 - 如何從日期列表中構建個人星期。我用這個例子編輯了我的問題,因爲它不是很清楚。 –

回答

1

正如你已經有日期屬性的每個活動,那麼它很簡單,實際上

最初只是決定你希望你周
恩:我只想去從MonSun一個星期

week view

所以在這裏Week nth將有日期 - 1st to 5th March
Week nth+1將有6th to 12th March等..據我所知,你已經有了各種活動(即摔法,跑步)與屬性日期(即3月9日8:58 2017)

因此,採取的例子在這裏(讓我知道如果這是你並不怎麼有你的數據):
waling - 1 March 2017 8:58 to 9:583 March 2017 6:20 to 6:508 March 2017 12:00 to 13:00


running - 2 March 2017 6:10 to 8:003 2017 March 7:00 to 8:009 March 2017 5:50 to 7:00


現在對於Week nth您可以通過添加了持續時間waling活動日期1st和計算數據3rd Marchwaling只存在於對March 2017Week nth這些日期,同樣爲week nth+1
同去的running活動week nth加起來爲日期2nd March,3rd Marchweek nth+1等等。

現在你將有類似:

周第n:

  • 嗷 - 1個小時30分鐘
  • 運行 - 2個小時50分鐘

周第n + 1:

  • 嗷 - 1個小時
  • 運行 - 1個小時和10分鐘


    並在每個活動的點擊就可以顯示更多細節..
    希望這會有所幫助:)

    編輯:
    考慮到這是你如何讓您的日期列表

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

List<Date> dates = new ArrayList<>(); 

    try { 
     dates.add(sdf.parse("10/03/2017")); 
     dates.add(sdf.parse("9/03/2017")); 
     dates.add(sdf.parse("8/03/2017")); 
     dates.add(sdf.parse("7/03/2017")); 
     dates.add(sdf.parse("6/03/2017")); 
     dates.add(sdf.parse("23/02/2017")); 
     dates.add(sdf.parse("3/02/2017")); 
     dates.add(sdf.parse("2/02/2017")); 
     dates.add(sdf.parse("1/02/2017")); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 

您可以創建自定義List只是爲了確定在同一個星期前
落在日期(我只是用什麼@Jameson在他的回答表明,你總是可以寫好多了):

public List<WeekDay> getListOfWeeksFromListOfDates(List<Date> listOfDates) { 
    List<WeekDay> listOfWeeks = new ArrayList<>(); 
    WeekDay weekDay; 
    for (Date date : listOfDates) { 
     weekDay = new WeekDay(date, new SimpleDateFormat("w").format(date)); 
     listOfWeeks.add(weekDay); 
    } 

    return listOfWeeks; 
} 


public class WeekDay { 

    Date date; 
    String weekIdentifier; 

    public WeekDay(Date Date, String WeekIdentifier) { 
     this.date = Date; 
     this.weekIdentifier = WeekIdentifier; 
    } 

    public Date getDate() { 
     return date; 
    } 

    public String getWeekIdentifier() { 
     return weekIdentifier; 
    } 

} 

你也可以使用getListOfWeeksFromListOfDates(dates);有一個列表DatesWeek號,week號可以作爲一個標識符比較的日期,然後你可以添加活動,與相同數量的Week日期..
希望你做了什麼我想在這裏表達:)

+0

嗨!謝謝您的回答!當你正確理解我時,我的計劃是總結每週所有日期的活動(例如散步,跑步)。但是,我仍然不確定如何使用Java代碼執行日期到周的分離。 –

+0

@GeorgiKoemdzhiev在我的答案更新了一些..請讓我知道如果你需要更多的幫助:) – shadygoneinsane

+0

謝謝你的答案!當我到家時,我會測試它:) –

1
/** 
* Gets a list of week numbers (as strings) from a list of dates. 
* 
* @param listOfDates the list of dates 
* @return a list of week in year (as string), corresponding 
*   one-to-one to the values in the input list. 
*/ 
public List<String> getListOfWeeksFromListOfDates(List<Date> listOfDates) { 
    List<String> listOfWeeks = new ArrayList<>(); 

    for (Date date : listOfDates) { 
     listOfWeeks.add(new SimpleDateFormat("w").format(date)); 
    } 

    return listOfWeeks; 
} 
+0

謝謝你的回答。但是,我在追求別的東西。我的問題更多的是關於你如何從日期列表中區分個人一週。例如,日期列表是過去50天(每天一個日期),您將如何構建一個代表一週的日期列表? –

+0

我改變了我的問題,所以它包括這個例子。我認爲那些反對者的選票來自那些不明白我在問什麼的人 –

1

周?

你還沒有定義你周的意思。

  • 你的意思是標準的ISO 8601 week,其中每週開始於週一和周#1包含第一個星期四,每週的編號爲1-52或53?
  • 或者你的意思是美國星期從星期天開始,週數從1-52/53開始,如果是,則是上一年或者新年的前一週的最後幾天?
  • 或者你的意思是別的嗎?

時區?

什麼時區想用作確定日期的上下文?或者你想保持你的UTC日期時間,像Stack Overflow在跟蹤你的活動「今天」與「昨天」嗎?

避免遺留日期時類

麻煩的舊日期類包括DateCalendar應儘可能避免。它們現在被java.time類所取代。

將給定的Date對象轉換爲Instant,這是UTC時間軸上的一個時刻。

Instant instant = myDate.toInstant(); 

ISO 8601

我建議使用standard week只要有可能。

將您的Instant調整到所需的時區。

ZoneId z = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = instant.atZone(z); 

檢索標準週數。

int weekNumber = zdt.get(WeekFields.ISO.weekOfWeekBasedYear()); 

記住的年份​​數字與此週數去是歷年。我們需要以星期爲基準的年份。例如,在某些年份,12月30日和31日可能屬於下一年以周爲單位的年份。

int yearOfWeekBasedYear = zdt.get(WeekFields.ISO.weekBasedYear()); 

你可以針對這個yearOfWeekBasedYearweekNumber組成的字符串跟蹤記錄。使用標準格式,如yyyy-Www,如2017-W07

ThreeTen-EXTRA YearWeek

相反,我建議你用有意義的對象,而不是單純的字符串。將ThreeTen-Extra庫添加到您的項目中以獲得YearWeek類。

該代碼取代了我們上面做的WeekFields代碼。

YearWeek yw = YearWeek.from(zdt); 
+0

謝謝你的詳細解答。 「周」是指英國時區周,每週從週一開始。我用一個我試圖實現的UI設計的例子更新了這個問題 –

+0

@GeorgiKoemdzhiev(A)那麼您的星期定義與ISO 8601相同嗎?我現在問過兩次了,你還沒有完全確定你的一週。這裏有一些關鍵的細節,你似乎忽略了。 (B)另外,你的用戶界面是不相關的。你需要按星期跟蹤你的數據對象,因此有兩個關於使用'Map'的答案,這裏我建議使用'YearWeek'對象作爲你的'Map'的「鍵」。 「Map」的「值」應該是您的數據摘要或您的單個數據對象的「集合」(如「List」)。 –

+0

道歉沒有提到我的情況是什麼是「周」。我認爲ISO 8601標準周將會很好。你提到使用Map解決我的問題,但是如何檢查日期是否是本月特定周的一部分? –

0

感謝@shadygoneinsane和@羅勒布爾克指着我正確的方向我解決了這個問題的方式如下:

TreeMap<Integer, List<Date>> dateHashMap = new TreeMap<>(); 

    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); 
    List<Date> dates = new ArrayList<>(); 


    dates.add(sdf.parse("10/03/2017")); 
    dates.add(sdf.parse("9/03/2017")); 
    dates.add(sdf.parse("8/03/2017")); 
    dates.add(sdf.parse("7/03/2017")); 
    dates.add(sdf.parse("6/03/2017")); 

    dates.add(sdf.parse("23/02/2017")); 
    dates.add(sdf.parse("3/02/2017")); 

    dates.add(sdf.parse("2/02/2017")); 
    dates.add(sdf.parse("1/02/2017")); 


    for (int i = 0; i < dates.size(); i++) { 
     List<Date> datesList = new ArrayList<>(); 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTime(dates.get(i)); 

     int weekOfMonth = calendar.get(Calendar.WEEK_OF_MONTH); 

     for (Date date : dates) { 
      Calendar c = Calendar.getInstance(); 
      c.setTime(date); 
      if (weekOfMonth == c.get(Calendar.WEEK_OF_MONTH)) { 
       datesList.add(date); 
      } 
     } 

     dateHashMap.put(weekOfMonth, datesList); 


    } 

    System.out.println(dateHashMap.toString()); 
} 

而結果:

輸出:

1=[Fri Feb 03 00:00:00 GMT 2017, 
Thu Feb 02 00:00:00 GMT 2017, 
Wed Feb 01 00:00:00 GMT 2017], 
2=[Fri Mar 10 00:00:00 GMT 2017, 
Thu Mar 09 00:00:00 GMT 2017, 
Wed Mar 08 00:00:00 GMT 2017, 
Tue Mar 07 00:00:00 GMT 2017, 
Mon Mar 06 00:00:00 GMT 2017], 
4=[Thu Feb 23 00:00:00 GMT 2017] 

正是我需要的!因此,現在我可以遍歷每週並總結統計數據,從而制定列表的「每週」視圖