演员" 1900-01-01T00:00:00"到目前为止的字符串值

时间:2017-06-22 17:53:25

标签: ios swift nsdate nsdateformatter

我已经看到堆栈溢出来找到答案而我找不到它我想要投射这个字符串值" 1900-01-01T00:00:00"对于日期格式,我尝试使用某些格式:

"yyyy-MM-dd HH:mm:ss"
"EEE, dd MMM yyyy hh:mm:ss +zzzz"
"YYYY-MM-dd HH:mm:ss.A"
"yyyy-MM-dd HH:mm:ss.S"   

但其中任何人都在工作。 我想要这样的日期格式

"dd-mm-yyyy"
希望你能帮助我!

感谢。

3 个答案:

答案 0 :(得分:1)

这是一个两步过程,首先将1900-01-01T00:00:00(称为RFC 3999或ISO 8601日期,参考定义此格式的规范)转换为Date对象,然后转换为Date对象返回01-01-1900形式的字符串:

  1. 要将1900-01-01T00:00:00形式的字符串转换为Date对象,您可以使用ISO8601DateFormatter

    let formatter = ISO8601DateFormatter()
    formatter.formatOptions.remove(.withTimeZone)
    
    let date = formatter.date(from: string)!
    

    这相当于以下DateFormat,其中必须手动将locale设置为en_US_POSIX(因为RFC 3999 / ISO 8601日期使用公历,不管是什么设备的默认日历类型)并将timeZone设置为GMT / Zulu,因为除非另有说明,否则RFC 3999 / ISO 8601日期通常代表GMT:

    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
    formatter.locale = Locale(identifier: "en_US_POSIX")
    formatter.timeZone = TimeZone(secondsFromGMT: 0)
    
    let date = formatter.date(from: string)!
    

    有关时区和语言环境在解析RFC 3999和ISO 8601日期中的重要性的更多信息,请参阅Apple的Technical Q&A 1480

  2. 然后,要将Date对象转换为字符串为01-01-1900(日,月和年),您需要使用格式字符串dd-MM-yyyy(注意“月份”的大写MM,以区别于mm为“分钟”):

    let formatter2 = DateFormatter()
    formatter2.dateFormat = "dd-MM-yyyy"
    
    let string = formatter2.string(from: date)
    

    关于dateFormat字符串的两个观察结果:

    • 如果此字符串用于向用户显示,则可以使用dateStyle而不是dateFormat,例如:

      formatter2.dateStyle = .short
      

      虽然这会产生稍微不同的格式,例如dd/MM/yy,这种方法的优点是字符串将被本地化(例如,英国用户将看到MM/dd/yyyy,这是他们查看短日期的首选方式。)

      这取决于dd-MM-yyyy格式的目的。如果是出于内部目的,请继续使用dateFormat。但是,如果要在您的用户界面中显示日期,请改用dateStyle,并享受DateFormatter自动为您执行的本地化。有关详细信息,请参阅DateFormatter reference的“使用日期和时间的用户可见表示”部分。

    • 请注意,如果没有为此第二个格式化程序指定timeZone,则会假定ISO 8601日期为GMT时,您希望在本地时区中查看日期。例如,(1900-01-01T00:00:00 GMT是1899年12月31日下午4点在加利福尼亚州)。如果要查看原始ISO 8601对象的日期字符串,而不是时区校正,您只需将第二个格式化程序的timeZone设置为GMT,例如

      formatter2.timeZone = TimeZone(secondsFromGMT: 0)
      
  3. 正如其他人所指出的,您希望避免不必要地重新实例化DateFormatter个对象。因此,您可以将这些格式化程序放在仅实例化一次的属性中,或者使用extension

    extension DateFormatter {
        static let customInputFormatter: ISO8601DateFormatter = {
            let formatter = ISO8601DateFormatter()
            formatter.formatOptions.remove(.withTimeZone)
            return formatter
        }()
    
        static let customOutputFormatter: DateFormatter = {
            let formatter = DateFormatter()
            formatter.dateFormat = "dd-MM-yyyy"
            formatter.timeZone = TimeZone(secondsFromGMT: 0)  // if you want date in your local timezone, remove this line
            return formatter
        }()
    }
    

    然后:

    let input = "1900-01-01T00:00:00"
    let date = DateFormatter.customInputFormatter.date(from: input)!
    let output = DateFormatter.customOutputFormatter.string(from: date)
    print(output)
    

答案 1 :(得分:-1)

使用我创建的此扩展程序,您可以将格式作为参数传递。

Private Sub setButtonAvailability()

Select Case Me.RequestStatus
  Case Null
    Me.PlaceInQueue.Visible = True
    Me.PlaceInQueue.Enabled = True
    Me.AssignScoping.Visible = False
    Me.AssignScoping.Enabled = False
    Me.AssignDevelopment.Visible = False
    Me.AssignDevelopment.Enabled = False
    Me.AssignTesting.Visible = False
    Me.AssignTesting.Enabled = False
    Me.AssignProduction.Visible = False
    Me.AssignProduction.Enabled = False
    Me.AssignAutomation.Visible = False
    Me.AssignAutomation.Enabled = False

    Me.Tabs.Pages("Intake").Caption = "Intake" & "*"
    Me.Tabs.Pages("Scoping").Caption = "Scoping"
    Me.Tabs.Pages("Development").Caption = "Development"
    Me.Tabs.Pages("Testing").Caption = "Testing"
    Me.Tabs.Pages("Production").Caption = "Production"
    Me.Tabs.Pages("Automation").Caption = "Automation"

 ...


  Case Else
    Me.PlaceInQueue.Visible = True
    Me.PlaceInQueue.Enabled = True
    Me.AssignScoping.Visible = True
    Me.AssignScoping.Enabled = True
    Me.AssignDevelopment.Visible = True
    Me.AssignDevelopment.Enabled = True
    Me.AssignTesting.Visible = True
    Me.AssignTesting.Enabled = True
    Me.AssignProduction.Visible = True
    Me.AssignProduction.Enabled = True
    Me.AssignAutomation.Visible = True
    Me.AssignAutomation.Enabled = True

    Me.Tabs.Pages("Intake").Caption = "Intake"
    Me.Tabs.Pages("Scoping").Caption = "Scoping"
    Me.Tabs.Pages("Development").Caption = "Development"
    Me.Tabs.Pages("Testing").Caption = "Testing"
    Me.Tabs.Pages("Production").Caption = "Production"
    Me.Tabs.Pages("Automation").Caption = "Automation"

  End Select
End Sub

答案 2 :(得分:-1)

这就是我自定义日期格式化程序的方法:

extension DateFormatter {

    static let inDateFormatter: DateFormatter = {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
        return dateFormatter
    }()

    static let outDateFormatter: DateFormatter = {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "dd-mm-yyyy"
        return dateFormatter
    }()
}

然后使用它:

if let date = DateFormatter.inDateFormatter.date(from: "1900-01-01T00:00:00") {
    let newDateString = DateFormatter.outDateFormatter.string(from: date);
    print(newDateString) //prints 01-00-1900
}

这可以避免任何潜在的性能问题,并且在使用时很明显,同时仍然简洁。