2015-08-21 4 views
4

Я пытаюсь отформатировать NSDate s в форме, где он использует относительный формат, когда это применимо, и день недели, когда нет: «Сегодня», «Завтра», «Воскресенье», "понедельник", ...NSDateFormatter: использование пользовательского формата с относительным форматированием

проблема заключается в том, NSDateFormatter «s doesRelativeFormatting работает только при использовании dateStyle, а не с dateFormat. (. В принципе, я бы нужна функциональность dateFormat = "EEEE" для всех дней после завтра)

На данный момент я использую следующий код:

let dateFormatter = NSDateFormatter() 
dateFormatter.timeStyle = .NoStyle 
dateFormatter.dateStyle = .FullStyle 
dateFormatter.doesRelativeDateFormatting = true 

let dateString = dateFormatter.stringFromDate(theDate) 
return dateString.componentsSeparatedByString(" ")[0] 

Который только случается работать в моей конкретной местности где NSDateFormatterStyle.FullStyle выводит что-то вроде «Sunday 23 August 2015», но, очевидно, это нехорошее или общее решение.

Ближайшая вещь, которую я нашел, будет this question, но она кажется излишне сложной для моего варианта использования, и мне хотелось бы что-то более элегантное, если это возможно.

Спасибо!

ответ

6

Я хотел бы использовать 3 Дата форматтеры:

  1. dateStyle = .FullStyle и doesRelativeDateFormatting = true
  2. dateStyle = .FullStyle и doesRelativeDateFormatting = false
  3. dateFormat = "EEEE" и doesRelativeDateFormatting = false

Получить отформатированные строки для 1 и 2. Если они являются разные, затем используйте строку из 1. Если они одинаковы, то получите и используйте строку из 3.

Это должно работать надежно для всех локалей. По соображениям производительности обязательно сохраняйте все 3 форматирования вместо того, чтобы каждый раз их воссоздавать.

1

Вот рабочее расширение :

import Foundation 

extension DateFormatter { 

    /* 
    * Returns a string representation of a given date in relative format. 
    * If the current local doesn't offer a relative format for the given date, 
    * then then a given format is applied. 
    * 
    * - parameter _date: The date to be formatted 
    * - parameter _format: The format to be applied to non-relative dates 
    * 
    * - returns: A string representing a formatted version of a given date 
    */ 

    func relativeStringWithFormat(from: Date, format: String) -> String? { 

     // Create date formatters 
     let _formatRelative = DateFormatter() 
      _formatRelative.dateStyle = .full 
      _formatRelative.doesRelativeDateFormatting = true 
      _formatRelative.timeStyle = .none 

     let _formatFull = DateFormatter() 
      _formatFull.dateStyle = .full 
      _formatFull.doesRelativeDateFormatting = false 
      _formatFull.timeStyle = .none 

     let _formatCustom = DateFormatter() 
      _formatCustom.dateFormat = format 
      _formatCustom.doesRelativeDateFormatting = false 

     // Get dates in available formats 
     let _dateRelative = _formatRelative.string(from: from) 
     let _dateFull = _formatFull.string(from: from) 
     let _dateCustom = _formatCustom.string(from: from) 

     // Return appropriatly formatted date/string 
     if _dateRelative != _dateFull { 

      return _dateRelative 

     } else { 

      return _dateCustom 
     } 
    } 
} 
Смежные вопросы