2016-12-16 7 views
0

В Android я могу генерировать метки для моей линейной диаграммы за последние 12 месяцев, включая этот месяц.Swift 3 - 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); 
    } 
} 

enumerateDates метод в Swift 3 «s Calendar класса является слишком запутанной. Я не знаю, использовать ли это или что-то еще. Все, что я хочу, это последние 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, когда он должен показать Dec '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 = date.map {dateFormatter.string (from: $ 0)! } 'вместо этого, поэтому ваше приложение вылетает при сбое форматирования даты – Alexander

1

Вы можете использовать Календарь, чтобы получить массив последних 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) 

Вы получите необходимые значения в массиве меток