Formatters.swift 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import Foundation
  2. import HealthKit
  3. enum Formatters {
  4. static func percent(for number: Double) -> String {
  5. let formater = NumberFormatter()
  6. formater.numberStyle = .percent
  7. return formater.string(for: number)!
  8. }
  9. static func timeFor(minutes: Int) -> String {
  10. let formater = DateComponentsFormatter()
  11. formater.unitsStyle = .abbreviated
  12. formater.allowedUnits = [.hour, .minute]
  13. return formater.string(from: TimeInterval(minutes * 60))!
  14. }
  15. }
  16. extension Formatter {
  17. static let iso8601withFractionalSeconds: ISO8601DateFormatter = {
  18. let formatter = ISO8601DateFormatter()
  19. formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
  20. return formatter
  21. }()
  22. static let iso8601: ISO8601DateFormatter = {
  23. let formatter = ISO8601DateFormatter()
  24. formatter.formatOptions = [.withInternetDateTime]
  25. return formatter
  26. }()
  27. }
  28. extension JSONDecoder.DateDecodingStrategy {
  29. static let customISO8601 = custom {
  30. let container = try $0.singleValueContainer()
  31. let string = try container.decode(String.self)
  32. if let date = Formatter.iso8601withFractionalSeconds.date(from: string) ?? Formatter.iso8601.date(from: string) {
  33. return date
  34. }
  35. throw DecodingError.dataCorruptedError(in: container, debugDescription: "Invalid date: \(string)")
  36. }
  37. }
  38. extension JSONEncoder.DateEncodingStrategy {
  39. static let customISO8601 = custom {
  40. var container = $1.singleValueContainer()
  41. try container.encode(Formatter.iso8601withFractionalSeconds.string(from: $0))
  42. }
  43. }