Ios Swift 3-Android相当于使用日历类度过12个月

Ios Swift 3-Android相当于使用日历类度过12个月,ios,swift,swift3,nsdate,nscalendar,Ios,Swift,Swift3,Nsdate,Nscalendar,在Android中,我能够为过去12个月(包括本月)的折线图生成标签 在myTimeDateHelper类中: public static DateFormat getMonthYearChartLabelFormat() { DateFormat monthYearChartLabelFormat = new SimpleDateFormat("MMM ''yy", Locale.US); monthYearChartLabelFormat.setTimeZone(TimeZo

在Android中,我能够为过去12个月(包括本月)的折线图生成标签

在my
TimeDateHelper
类中:

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);
    }
}
在我的另一个
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 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)
}

撇号因为某种原因不起作用(例如,当它应该显示12月16日时,它显示12月16日)。

这是我的第一次尝试

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)

这是我第一次尝试

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)

您可以使用日历获取最近12个月+年值的数组。 以下是您在Android中所做的Swift 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)

您将在标签数组中获取所需的值

您可以使用日历获取最近12个月的数组月+年值。 以下是您在Android中所做的Swift 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)

您将在标签数组中获得必需的值

您希望输出为字符串还是日期对象?字符串,我将使用我迄今为止输入的格式编辑帖子您希望输出为字符串还是日期对象?字符串,我将使用迄今为止输入的格式编辑帖子,当我将其更改为使用我的日期格式设置程序时,它打印的是空字符串,可能是因为时区吗?@Rafi啊,是的,无声的失败再次降临<代码>flapMap过滤器
nil
结果。最好改用
let strings=dates.map{dateFormatter.string(from:$0)!}
,这样当日期格式化程序出现故障时,应用程序就会崩溃。我想知道的另一件事是,为什么你的格式化程序使用撇号,而头脑却没有?!真奇怪
flatMap
类似于
map
,但它会在将结果添加到输出数组之前将其展平。例如,
[[1,2,3],[4,5,6],[7,8,9]]。平面地图{$0}
产生
[1,2,3,4,5,6,7,8,9]
。它还可用于展开数组中的所有选项,并剔除
nil
s。正如您所看到的,缺点是这是一种无故障的方法,可能会产生难以捕获的错误。当我将其更改为使用dateFormatter时,它会打印空字符串。可能是因为时区的原因吗?@Rafi啊,是的,无故障再次出现<代码>flapMap过滤器
nil
结果。最好改用
let strings=dates.map{dateFormatter.string(from:$0)!}
,这样当日期格式化程序出现故障时,应用程序就会崩溃。我想知道的另一件事是,为什么你的格式化程序使用撇号,而头脑却没有?!真奇怪
flatMap
类似于
map
,但它会在将结果添加到输出数组之前将其展平。例如,
[[1,2,3],[4,5,6],[7,8,9]]。平面地图{$0}
产生
[1,2,3,4,5,6,7,8,9]
。它还可用于展开数组中的所有选项,并剔除
nil
s。正如您所看到的,缺点是这是一种无故障的方法,可能会产生难以捕获的bug