2016-12-16 15 views
10

Tôi đã gặp sự cố, khi DateComponentsFormatter trả về số lượng đơn vị không mong muốn. Có ai phải đối mặt với cùng một vấn đề?DateComponentsFormatter trả về số lượng sai số đơn vị

import Foundation 

let formatter = DateComponentsFormatter() 
formatter.unitsStyle = .full; 
formatter.maximumUnitCount = 1; 

let date = Date(timeIntervalSinceNow: -14.7 * 24 * 60 * 60) 
let dateString = formatter.string(from: date, to: Date()) // 2 weeks 1 day 

Tôi mong nhận được "2 tuần" nhưng có "2 tuần 1 ngày".

+0

Tại sao bạn sử dụng '14.7'? – shallowThought

+0

@shallowTôi nghĩ tôi đã đặt 'maximumUnitCount' - trình định dạng không được trả về nhiều hơn một đơn vị. –

+0

FYI - Sử dụng 'Date (timeIntervalSinceNow: -14.7 * 24 * 60 * 60)' là một cách khủng khiếp để làm toán ngày. Không phải mỗi ngày đều có 24 giờ. Không phải mỗi giờ đều có 3600 giây. Sử dụng một trong các phương thức 'Calendar date (byAdding ...)'. – rmaddy

Trả lời

1

Bạn đang chuyển -14,7 được làm tròn thành -15. Vì vậy, bạn đang nhận được 2 tuần 1 ngày. Vì vậy, làm tròn số đúng cách để có được kết quả mong đợi.

+3

Tôi đã đặt 'maximumUnitCount' - trình định dạng không được trả về nhiều hơn một đơn vị. –

+2

Lạ. Ngay sau khi bạn làm cho nó nhỏ hơn -14,5, nó chỉ hiển thị một đơn vị. Nếu bạn thực hiện -15 trở đi thì nó cũng chỉ hiển thị 1 đơn vị. Một nơi nào đó giữa -14,5 đến -14,99, nó không thành công. Cùng được quan sát thấy khi bắt đầu của bất kỳ tuần mới. Ý tôi là -21, -28 và như vậy .. – Apurv

+0

cảm ơn. Bây giờ bạn thấy.) –

3

tôi giải quyết vấn đề này bằng cách kiểm tra các dấu phân cách bởi dấu phẩy và sử dụng nó để substring đầu ra DateFormatters, sân chơi ví dụ trong Swift 3

// Test date 
var df = DateFormatter() 
df.dateFormat = "dd.MM.yyyy HH:mm:ss" 
df.timeZone = TimeZone(secondsFromGMT: 0) 
let fromDate = df.date(from: "01.01.2000 00:00:00") 
var timeDifference = Date().timeIntervalSince(fromDate!) 

// Setup formatter 
let formatter = DateComponentsFormatter() 
formatter.unitsStyle = .full 
formatter.includesApproximationPhrase = false 
formatter.zeroFormattingBehavior = .dropAll 
formatter.maximumUnitCount = 1 
formatter.allowsFractionalUnits = false 

// Use the configured formatter to generate the string. 
var outputString = formatter.string(from: timeDifference) ?? "" 

// Remove 2nd unit if exists 
let commaIndex = outputString.characters.index(of: ",") ?? outputString.endIndex 
outputString = outputString.substring(to: commaIndex) 

// Result 
print(outputString) 
+0

Tôi đề nghị kiểm tra số lần xuất hiện "," tùy thuộc vào 'maximumUnitCount' để làm cho nó tổng quát hơn. Đồng thời, có phải tất cả các ngôn ngữ đều sử dụng dấu phẩy để phân tách các đơn vị? –

+0

[Bài đăng OpenRadar] (https://openradar.appspot.com/26354907) chỉ xác định rằng 'maximumUnitCount = 1' chỉ hiển thị lỗi. Tôi đã kiểm tra [tài liệu] (https://developer.apple.com/reference/foundation/datecomponentsformatter/) và không tìm thấy bất kỳ thông tin nào về các dấu tách. Dự phòng chỉ sử dụng toàn bộ chuỗi không đổi nên tôi nghĩ đây là dự phòng chấp nhận được. – Mknsri

+0

OK, tôi sẽ upvote câu trả lời của bạn bởi vì tôi làm gần như giống nhau. –

0

Tôi sẽ đề xuất một chút giải pháp đáng tin cậy hơn (trong khi vẫn không chắc chắn nó hoạt động cho tất cả các trường hợp)

let formatter = DateComponentsFormatter() 
formatter.unitsStyle = .full 
formatter.maximumUnitCount = 1 

let date = Date(timeIntervalSinceNow: -14.7 * 24 * 60 * 60) 
let dateString = formatter.string(from: date, to: Date()) ?? "" 
if let nsRange = try? NSRegularExpression(pattern: "\\A\\d* \\w*").rangeOfFirstMatch(in: dateString, options: [], range: NSRange(location: 0, length: dateString.count)), let range = Range(nsRange, in: dateString) { 
    let fixedString = String(dateString[range]) 
} 
Các vấn đề liên quan