【问题标题】:Swift 3 - Android Equivalent Of Getting Past 12 Months Using Calendar ClassSwift 3 - 相当于使用日历类过去 12 个月的 Android
【发布时间】:2023-03-18 16:28:01
【问题描述】:

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

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

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 完成这项工作?

**** 进度 ****

到目前为止,我已经设置了一些格式:

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 年 12 月时,它显示了 12 月 16 日)。

【问题讨论】:

  • 您希望输出为字符串还是日期对象?
  • 字符串,我将使用我目前输入的格式编辑帖子

标签: ios swift swift3 nsdate nscalendar


【解决方案1】:

这是我的第一次尝试。

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)

【讨论】:

  • 奇怪,当我将其更改为使用我的 dateFormatter 时,它会打印空字符串
  • 可能是时区问题?
  • @Rafi 啊,是的,无声的失败又来了。 flapMap 过滤 nil 结果。最好改用let strings = dates.map{ dateFormatter.string(from: $0)! },这样当日期格式化程序失败时,您的应用就会崩溃
  • 不错。我想知道的另一件事是为什么您的格式化程序可以使用撇号但头脑却没有?!太奇怪了!
  • flatMap 类似于map,但它在将结果添加到输出数组之前将其展平。例如[[1, 2, 3], [4, 5, 6], [7, 8, 9]].flatMap{ $0 } 产生[1, 2, 3, 4, 5, 6, 7, 8, 9]。它对于解开数组中的所有选项以及清除 nils 也很有用。如您所见,缺点是这是一种无提示失败的方法,可能会产生难以捕获的错误
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2020-07-14
    • 2021-07-04
    • 1970-01-01
    相关资源
    最近更新 更多