2016-12-16 7 views
0

Androidには、今月を含む過去12ヶ月間の折れ線グラフのラベルを生成できます。Swift 3 - カレンダークラスを使用して過去12ヶ月を取得することに相当するAndroid

TimeDateHelperクラスでは:私の他のLineChartActivityクラスで

public static DateFormat getMonthYearChartLabelFormat() { 
    DateFormat monthYearChartLabelFormat = new SimpleDateFormat("MMM ''yy", Locale.US); 
    monthYearChartLabelFormat.setTimeZone(TimeZone.getDefault()); 
    return monthYearChartLabelFormat; 
} 

private void setUpMonthLabels() { 
    this.labels = new ArrayList<>(); 
    Calendar cal = Calendar.getInstance(); 
    cal.setTimeZone(TimeZone.getDefault()); 
    cal.add(Calendar.MONTH, -11); 
    for (int i = 0; i < 12; i++) { 
     this.labels.add(TimeDateHelper.getMonthYearChartLabelFormat().format(cal.getTime())); 
     cal.add(Calendar.MONTH, 1); 
    } 
} 

Swift 3CalendarクラスのenumerateDates方法があまりにも混乱しています。私はそれを使うかどうか分からない。私が望むのは今月を含め過去12ヶ月間です。たとえば、今月は12月ですので、出力は次のようになります。

Jan '16 
Feb '16 
Mar '16 
Apr '16 
May '16 
Jun '16 
Jul '16 
Aug '16 
Sep '16 
Oct '16 
Nov '16 
Dec '16 

これをSwift 3でどうやって行うことができますか?

**** **** PROGRESS

はこれまでのところ、私はいくつかの書式が設定されている:

let dateFormatter: DateFormatter = { 
    let formatter = DateFormatter() 
    formatter.timeZone = TimeZone.current 
    return formatter 
}() 

func getMonthYearChartLabelString(fromDate date: Date) -> String { 
    dateFormatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "MMM ''yy", options: 0, locale: Locale(identifier: "en-US")) 
    return dateFormatter.string(from: date) 
} 

アポストロフィは元(カントー何らかの理由で動作しません、それは12月を示しています。 12月16日が表示されるべきときは16)。

+0

に必要な値を取得しますあなたは、文字列または日付オブジェクトとして出力をしたいですか? – Alexander

+0

文字列、今まで入れた書式で投稿を編集します – Rafi

答えて

2

ここに私の最初の刺し傷があります。

import Foundation 

var past12Months: [String] { 
    let today = Date() 
    let dates = (-12...0).flatMap{ Calendar.current.date(byAdding: .month, value: $0, to: today)} 

    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "MMM ''yy" 

    let strings = dates.map{ dateFormatter.string(from: $0)! } //TODO: add error handling here 
    return strings 
} 

print(past12Months) 
+0

奇妙なことに、dateFormatterを使用して変更すると、空の文字列が表示されます – Rafi

+0

タイムゾーンが原因ですか? – Rafi

+0

@Rafiああ、静かな失敗が再び襲います。 'flapMap'は' nil'結果をフィルタリングします。 'let strings = dates.map {dateFormatter.string(from:$ 0)! } '代わりに、日付フォーマッタが失敗したときにあなたのアプリがクラッシュするようになりました。 – Alexander

1

カレンダーを使用して、過去12ヶ月の月と年の値の配列を取得できます。ここ は、あなたは、Androidでやっていることのスウィフト3と同等である:

let cal = Calendar.current 
    var date = cal.startOfDay(for: Date()) 
    var lables = [String]() 
    let dateFormatter: DateFormatter = DateFormatter() 

    let months = dateFormatter.shortMonthSymbols 

    for i in 1 ... 12 { 
     let mon = cal.component(.month, from: date) 
     let month = months?[mon-1] //as! String // month - from your date components 
     let year = String(cal.component(Calendar.Component.yearForWeekOfYear, from: date)) 
     let index1 = year.index(year.endIndex, offsetBy: -2) 
     let strDate = month! + " '" + year.substring(from: index1); 
     lables.append(strDate) 
     date = cal.date(byAdding: .month, value: -1, to: date)! 
    } 
    print(lables) 

あなたがラベル配列

関連する問題