2016-12-16 38 views
0

Android中,我可以生成包括本月在內的過去12個月的線形圖標籤。Swift 3 - 使用日曆類獲得過去12個月的Android等效

在我TimeDateHelper類:

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

在我的其他LineChartActivity類:

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); 
    } 
} 

enumerateDates方法Swift 3Calendar類是太混亂。我不知道是否使用那個或別的東西。我想要的是包括本月在內的過去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 

我怎樣才能得到這與雨燕3做了什麼?

**** ****進展

到目前爲止,我有些格式設置:

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) 
} 

撇號不會因爲某些原因壽工作(當然它顯示十二月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個月的數組+月份+年份值。 這裏是斯威夫特3相當於你已經在Android中做了什麼:

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) 

您將獲得所需的標籤數組值