Swift 3 - 使用日历类获得过去12个月的Android等效

问题描述:

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

这是我第一次刺伤它。

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

您可以使用日历来获取过去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) 

您将获得所需的标签数组值