Chuyển đổi NSString thành NSDate (và quay lại)


229

Làm cách nào để chuyển đổi một NSString" 01/02/10 " (nghĩa là ngày 1 tháng 2 năm 2010) thành một NSDate? Và làm thế nào tôi có thể biến mặt NSDatesau thành một chuỗi?


sử dụng năm 2010 và sau đó có một cái nhìn vào bài viết của tôi. Tôi đã cung cấp một chuyển đổi cho cả hai quá trình.
Pavan

Câu trả lời:


450

Swift 4 trở lên

Cập nhật: 2018

Chuỗi đến ngày

var dateString = "02-03-2017"
var dateFormatter = DateFormatter()

// This is important - we set our input date format to match our input string
// if the format doesn't match you'll get nil from your string, so be careful
dateFormatter.dateFormat = "dd-MM-yyyy"

//`date(from:)` returns an optional so make sure you unwrap when using. 
var dateFromString: Date? = dateFormatter.date(from: dateString)

Ngày đến chuỗi

var formatter = DateFormatter()
formatter.dateFormat = "dd-MM-yyyy"
guard let unwrappedDate = dateFromString else { return }

//Using the dateFromString variable from before. 
let stringDate: String = formatter.string(from: dateFromString)

Swift 3

Cập nhật: ngày 20 tháng 7 năm 2017

Chuỗi đến NSDate

var dateString = "02-03-2017"
var dateFormatter = DateFormatter()
// This is important - we set our input date format to match our input string
// if the format doesn't match you'll get nil from your string, so be careful
dateFormatter.dateFormat = "dd-MM-yyyy"
var dateFromString = dateFormatter.date(from: dateString)

NSDate thành chuỗi

var formatter = DateFormatter()
formatter.dateFormat = "dd-MM-yyyy"
let stringDate: String = formatter.string(from: dateFromString)

Nhanh

Cập nhật: ngày 22 tháng 10 năm 2015

Chuỗi đến NSDate

var dateString = "01-02-2010"
var dateFormatter = NSDateFormatter()
// this is imporant - we set our input date format to match our input string
dateFormatter.dateFormat = "dd-MM-yyyy"
// voila!
var dateFromString = dateFormatter.dateFromString(dateString)

NSDate thành chuỗi

var formatter = NSDateFormatter()
formatter.dateFormat = "dd-MM-yyyy"
let stringDate: String = formatter.stringFromDate(NSDate())
println(stringDate)

Mục tiêu-C

NSString đến NSDate

NSString *dateString = @"01-02-2010";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd-MM-yyyy"];
NSDate *dateFromString = [dateFormatter dateFromString:dateString];

NSDate chuyển đổi thành NSString:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd-MM-yyyy"];
NSString *stringDate = [dateFormatter stringFromDate:[NSDate date]];
NSLog(@"%@", stringDate);

đó có phải là hai ys trong setDateFormat không?
cannyboy

Tôi không chắc chắn nếu 2 y làm việc. nhưng quy tắc ngón tay cái là định dạng mà bạn sẽ cung cấp cho keeo định dạng tương tự cho setDateFormat. Vì vậy, trty đầu tiên 2010 và viết 4 y giống như 'yyyy'. như tôi chắc chắn rằng nó sẽ hoạt động chắc chắn
Pavan

1
hoàn toàn đáng để kiểm tra bài này
iOmi

7
Lý do gì NSDate *dateFromString = [[NSDate alloc] init];nếu gán một giá trị mới cho con trỏ trong dòng tiếp theo ???
Valeriy Van

4
Một mục khác cần chú ý - Nếu giá trị chuỗi (ngày) của bạn được liệt kê là 29/05/2013, cuộc gọi của bạn tới setDateFormat sẽ cần khớp với nhau - tức là [dateFormatter setDateFormat: @ "MM / dd / yyyy"] - cá nhân tôi đã giúp tiếp tục cố gắng sử dụng dấu gạch nối khi dữ liệu chuỗi của họ bị cắt. - Pavan trả lời tuyệt vời.
noobzilla

54

CẬP NHẬT 2019 (Swift 4):

Thực hiện một Datephần mở rộng cho điều đó. Nó sử dụng NSDataDetectorthay vì NSDateFormatter.

// Just throw at it without any format.
var date: Date? = Date.FromString("02-14-2019 17:05:05")

Khá thú vị, nó thậm chí còn nhận ra những thứ như "Ngày mai lúc 5" .

XCTAssertEqual(Date.FromString("2019-02-14"),                    Date.FromCalendar(2019, 2, 14))
XCTAssertEqual(Date.FromString("2019.02.14"),                    Date.FromCalendar(2019, 2, 14))
XCTAssertEqual(Date.FromString("2019/02/14"),                    Date.FromCalendar(2019, 2, 14))
XCTAssertEqual(Date.FromString("2019 Feb 14"),                   Date.FromCalendar(2019, 2, 14))
XCTAssertEqual(Date.FromString("2019 Feb 14th"),                 Date.FromCalendar(2019, 2, 14))
XCTAssertEqual(Date.FromString("20190214"),                      Date.FromCalendar(2019, 2, 14))
XCTAssertEqual(Date.FromString("02-14-2019"),                    Date.FromCalendar(2019, 2, 14))
XCTAssertEqual(Date.FromString("02.14.2019 5:00 PM"),            Date.FromCalendar(2019, 2, 14, 17))
XCTAssertEqual(Date.FromString("02/14/2019 17:00"),              Date.FromCalendar(2019, 2, 14, 17))
XCTAssertEqual(Date.FromString("14 February 2019 at 5 hour"),    Date.FromCalendar(2019, 2, 14, 17))
XCTAssertEqual(Date.FromString("02-14-2019 17:05:05"),           Date.FromCalendar(2019, 2, 14, 17, 05, 05))
XCTAssertEqual(Date.FromString("17:05, 14 February 2019 (UTC)"), Date.FromCalendar(2019, 2, 14, 17, 05))
XCTAssertEqual(Date.FromString("02-14-2019 17:05:05 GMT"),       Date.FromCalendar(2019, 2, 14, 17, 05, 05))
XCTAssertEqual(Date.FromString("02-13-2019 Tomorrow"),           Date.FromCalendar(2019, 2, 14))
XCTAssertEqual(Date.FromString("2019 Feb 14th Tomorrow at 5"),   Date.FromCalendar(2019, 2, 14, 17))

Thích:

extension Date
{


    public static func FromString(_ dateString: String) -> Date?
    {
        // Date detector.
        let detector = try! NSDataDetector(types: NSTextCheckingResult.CheckingType.date.rawValue)

        // Enumerate matches.
        var matchedDate: Date?
        var matchedTimeZone: TimeZone?
        detector.enumerateMatches(
            in: dateString,
            options: [],
            range: NSRange(location: 0, length: dateString.utf16.count),
            using:
            {
                (eachResult, _, _) in

                // Lookup matches.
                matchedDate = eachResult?.date
                matchedTimeZone = eachResult?.timeZone

                // Convert to GMT (!) if no timezone detected.
                if matchedTimeZone == nil, let detectedDate = matchedDate
                { matchedDate = Calendar.current.date(byAdding: .second, value: TimeZone.current.secondsFromGMT(), to: detectedDate)! }
        })

        // Result.
        return matchedDate
    }
}

CẬP NHẬT 2014:

Đã thực hiện một phần mở rộng NSString cho điều đó.

// Simple as this.   
date = dateString.dateValue;

Nhờ NSDataDetector , nó nhận ra rất nhiều định dạng.

'2014-01-16' dateValue is <2014-01-16 11:00:00 +0000>
'2014.01.16' dateValue is <2014-01-16 11:00:00 +0000>
'2014/01/16' dateValue is <2014-01-16 11:00:00 +0000>
'2014 Jan 16' dateValue is <2014-01-16 11:00:00 +0000>
'2014 Jan 16th' dateValue is <2014-01-16 11:00:00 +0000>
'20140116' dateValue is <2014-01-16 11:00:00 +0000>
'01-16-2014' dateValue is <2014-01-16 11:00:00 +0000>
'01.16.2014' dateValue is <2014-01-16 11:00:00 +0000>
'01/16/2014' dateValue is <2014-01-16 11:00:00 +0000>
'16 January 2014' dateValue is <2014-01-16 11:00:00 +0000>
'01-16-2014 17:05:05' dateValue is <2014-01-16 16:05:05 +0000>
'01-16-2014 T 17:05:05 UTC' dateValue is <2014-01-16 17:05:05 +0000>
'17:05, 1 January 2014 (UTC)' dateValue is <2014-01-01 16:05:00 +0000>

Một phần của bộ eppz!, Lấy danh mục NSString + EPPZKit.h từ GitHub.


TRẢ LỜI GỐC 2013:

Cho dù bạn không chắc chắn (hoặc không quan tâm) về định dạng ngày có trong chuỗi, hãy sử dụng NSDataDetector để phân tích ngày .

//Role players.
NSString *dateString = @"Wed, 03 Jul 2013 02:16:02 -0700";
__block NSDate *detectedDate;

//Detect.
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingAllTypes error:nil];
[detector enumerateMatchesInString:dateString
                           options:kNilOptions
                             range:NSMakeRange(0, [dateString length])
                        usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop)
{ detectedDate = result.date; }];

Nó dường như không hỗ trợ định dạng 24 giờ. Ví dụ: NSString> 2013-09-11 01:31:22 +0000chuyển đổi thành NSDate->2013-09-11 13:31:22 +0000
sooper

Tôi thích câu trả lời này nhất vì chuỗi ngày ban đầu có thể rất tùy ý. Điều này thật tuyệt vời trong trường hợp người dùng nhập ngày vào trường văn bản thay vì qua bộ chọn.
Kyle

2
Làm thế nào phương pháp này sẽ quyết định nếu ngày ở trong DD / MM / yyyy hoặc MM / DD / yyyy? ví dụ nếu đầu vào là 01/03/2014 thì kết quả sẽ như thế nào?
ahmad

@ahmad Tôi hoàn toàn đồng ý - phương pháp này có thể sẽ không hiệu quả nếu bạn phải hỗ trợ các cài đặt ngôn ngữ khác nhau.
Frank Schmitt

@sooper XCTAssertEqual(Date.FromString("2013-09-11 01:31:22 +0000"), Date.FromCalendar(2013, 9, 11, 1, 31, 22))có vẻ ổn.
Geri Borbás

33

Khi sử dụng ngày định dạng cố định, bạn cần đặt ngôn ngữ định dạng ngày thành "en_US_POSIX" .

Lấy từ Hướng dẫn định dạng dữ liệu

Nếu bạn đang làm việc với các ngày có định dạng cố định, trước tiên bạn nên đặt ngôn ngữ của trình định dạng ngày thành một cái gì đó phù hợp với định dạng cố định của bạn. Trong hầu hết các trường hợp, ngôn ngữ tốt nhất để chọn là en_US_POSIX, một ngôn ngữ được thiết kế đặc biệt để mang lại kết quả tiếng Anh Mỹ bất kể cả sở thích của người dùng và hệ thống . en_US_POSIX cũng bất biến theo thời gian (nếu tại Hoa Kỳ, tại một thời điểm nào đó trong tương lai, thay đổi cách định dạng ngày, en_US sẽ thay đổi để phản ánh hành vi mới, nhưng en_US_POSIX sẽ không hoạt động) và giữa các nền tảng (en_US_POSIX hoạt động giống nhau trên iPhone Hệ điều hành giống như trên OS X và trên các nền tảng khác).

Swift 3 trở lên

extension Formatter {
    static let customDate: DateFormatter = {
        let formatter = DateFormatter()
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = "dd/MM/yy"
        return formatter
    }()
    static let time: DateFormatter = {
        let formatter = DateFormatter()
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = "HH:mm"
        return formatter
    }()
    static let weekdayName: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "cccc"
        return formatter
    }()
    static let month: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "LLLL"
        return formatter
    }()
}

extension Date {
    var customDate: String {
        return Formatter.customDate.string(from: self)
    }
    var customTime: String {
        return Formatter.time.string(from: self)
    }
    var weekdayName: String {
        return Formatter.weekdayName.string(from: self)
    }
    var monthName: String {
        return Formatter.month.string(from: self)
    }
}

extension String {
    var customDate: Date? {
        return Formatter.customDate.date(from: self)
    }
}

sử dụng:

// this will be displayed like this regardless of the user and system preferences
Date().customTime          //  "16:50"
Date().customDate          //  "06/05/17"
// this will be displayed according to user and system preferences
Date().weekdayName         //  "Saturday"
Date().monthName           //  "May"

Phân tích ngày tùy chỉnh và chuyển đổi ngày trở lại cùng định dạng chuỗi:

let dateString = "01/02/10"

if let date = dateString.customDate {
    print(date.customDate)   // "01/02/10\n"
    print(date.monthName)    // customDate
}

Đây là tất cả các yếu tố bạn có thể sử dụng để tùy chỉnh nó khi cần thiết:

nhập mô tả hình ảnh ở đây


Điều gì nếu nhiều luồng truy cập các phương thức này? Điều đó có thể dẫn đến sai lầm do gán lại dateFormat của trình định dạng không? Việc sử dụng các biến số (ngày / thời gian / ngày trong tuần) chỉ là một sở thích của bạn hay chúng có thể là một lợi thế khi thực hiện theo cách đó hay đó là một cách thực hành tốt nhất?
lahmar

19

Tại sao không thêm một danh mục vào NSString?

// NSString+Date.h
@interface NSString (Date)
+ (NSDate*)stringDateFromString:(NSString*)string;
+ (NSString*)stringDateFromDate:(NSDate*)date;
@end


// NSString+Date.m
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss ZZZ"];

NSDate *date = [dateFormatter dateFromString:stringDate ];
[dateFormatter release];
+ (NSDateFormatter*)stringDateFormatter
{
    static NSDateFormatter* formatter = nil;
    if (formatter == nil)
    {
        formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss ZZZ"];
    }   
    return formatter;
}

+ (NSDate*)stringDateFromString:(NSString*)string
{
    return [[NSString stringDateFormatter] dateFromString:string];
}

+ (NSString*)stringDateFromDate:(NSDate*)date
{
    return [[NSString stringDateFormatter] stringFromDate:date];
}


// Usage (#import "NSString+Date.h") or add in "YOUR PROJECT".pch file
NSString* string = [NSString stringDateFromDate:[NSDate date]];
NSDate* date = [NSString stringDateFromString:string];

Tìm thấy điều này thực sự hữu ích. Cảm ơn!
Thomas Johannesmeyer

6

sử dụng "10" để đại diện cho một năm là không tốt, bởi vì nó có thể là 1910, 1810, v.v. Có lẽ bạn nên sử dụng 4 chữ số cho điều đó.

Nếu bạn có thể thay đổi ngày thành một cái gì đó như

yyyymmdd

Sau đó, bạn có thể sử dụng:

// Convert string to date object
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyyMMdd"];
NSDate *date = [dateFormat dateFromString:dateStr];  

// Convert date object to desired output format
[dateFormat setDateFormat:@"EEEE MMMM d, YYYY"];
dateStr = [dateFormat stringFromDate:date];  
[dateFormat release];

4
NSString *dateStr = @"Tue, 25 May 2010 12:53:58 +0000";

// Convert string to date object
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"EE, d LLLL yyyy HH:mm:ss Z"];
NSDate *date = [dateFormat dateFromString:dateStr]; 
[dateFormat release];

2
// Convert string to date 

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyyMMdd"];
NSDate *date = [dateFormat dateFromString:dateStr];  

// Convert Date to string

[dateFormat setDateFormat:@"EEEE MMMM d, YYYY"];
dateStr = [dateFormat stringFromDate:date];  
[dateFormat release];

1
NSString *mystr=@"Your string date";

NSCalendar *cal = [NSCalendar currentCalendar];
NSDate *now = [dateFormatter dateFromString:mystr];

Nslog(@"%@",now);

Nếu bạn muốn đặt định dạng, hãy sử dụng mã dưới đây:

NSString *dateString = @"01-02-2010";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

// this is important - we set our input date format to match our input string
// if format doesn't match you'll get nil from your string, so be careful
[dateFormatter setDateFormat:@"dd-MM-yyyy"];
NSDate *dateFromString = [[NSDate alloc] init];

// voila!
dateFromString = [dateFormatter dateFromString:dateString];
Nslog(@"%@",[dateFormatter dateFromString:dateString]);

1

Sử dụng phương pháp này để chuyển đổi từ NSStringsang NSdate:

-(NSDate *)getDateFromString:(NSString *)pstrDate
{
    NSDateFormatter* myFormatter = [[NSDateFormatter alloc] init];
    [myFormatter setDateFormat:@"dd/MM/yyyy"];
    NSDate* myDate = [myFormatter dateFromString:pstrDate];
    return myDate;
}

1

Nếu bất cứ ai quan tâm đến việc làm một cái gì đó như thế này trong Swift những ngày này, tôi có một khởi đầu về một cái gì đó, mặc dù nó không hoàn hảo.

func detectDate(dateString: NSString) -> NSDate {

    var error: NSError?
    let detector: NSDataDetector = NSDataDetector.dataDetectorWithTypes(NSTextCheckingType.Date.toRaw(), error: &error)!

    if error == nil {
        var matches = detector.matchesInString(dateString, options: nil, range: NSMakeRange(0, dateString.length))

        let currentLocale = NSLocale.currentLocale()
        for match in matches {
            match.resultType == NSTextCheckingType.Date
            NSLog("Date: \(match.date.description)")
            return match.date
        }
    }
    return NSDate()
}

1

Ngày đến NSString

NSString *dateString = [NSString stringWithFormat:@"%@",[NSDate date]];
NSLog(@"string: %@",dateString ); //2015-03-24 12:28:49 +0000

NSString đến NSDate

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
NSDate *date = [formatter dateFromString:dateString];
NSLog(@"date: %@", date); //015-03-24 12:28:49 +0000

0

Bạn có thể sử dụng phần mở rộng cho việc này.

extension NSDate {
    //NSString to NSDate
    convenience
    init(dateString:String) {
        let nsDateFormatter = NSDateFormatter()
        nsDateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss"
        // Add the locale if required here
        let dateObj = nsDateFormatter.dateFromString(dateString)
        self.init(timeInterval:0, sinceDate:dateObj!)
    }

    //NSDate to time string
    func getTime() -> String {
        let timeFormatter = NSDateFormatter()
        timeFormatter.dateFormat = "hh:mm"
        //Can also set the default styles for date or time using .timeStyle or .dateStyle
        return timeFormatter.stringFromDate(self)
    }

    //NSDate to date string
    func getDate() -> String {
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "dd, MMM"
        return dateFormatter.stringFromDate(self)
    }

    //NSDate to String
    func getString() -> String {
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss"
        return dateFormatter.stringFromDate(self)
    }
}

Vì vậy, trong khi thực thi mã thực tế sẽ trông như sau

    var dateObjFromString = NSDate(dateString: cutDateTime)
    var dateString = dateObjFromString.getDate()
    var timeString = dateObjFromString.getTime()
    var stringFromDate = dateObjFromString.getString()

Cũng có một số phương thức mặc định nhưng tôi đoán nó có thể không hoạt động với định dạng bạn đã cung cấp từ tài liệu

    -dateFromString(_:)
    -stringFromDate(_:)
    -localizedStringFromDate(_ date: NSDate,
                     dateStyle dateStyle: NSDateFormatterStyle,
                     timeStyle timeStyle: NSDateFormatterStyle) -> String

0

Cách thực hành tốt nhất là xây dựng cho mình một lớp chung nơi bạn đặt tất cả các phương thức sử dụng chung, các phương thức hữu ích trong hầu hết tất cả các dự án và ở đó thêm mã được đề xuất bởi @Pavan như:

+ (NSDate *)getDateOutOfString:(NSString *)passedString andDateFormat:(NSString *)dateFormat{

    NSString *dateString = passedString;
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:dateFormat];
    NSDate *dateFromString = [[NSDate alloc] init];
    dateFromString = [dateFormatter dateFromString:dateString];
    return dateFromString;

}

.. và như vậy cho tất cả các phương pháp hữu ích khác

Bằng cách làm như vậy, bạn bắt đầu xây dựng một mã tái sử dụng sạch cho ứng dụng của mình. Chúc mừng!


0

Theo Swift 2.2

Bạn có thể dễ dàng nhận được NSDate từ Chuỗi và Chuỗi từ NSDate. ví dụ

Bộ định dạng ngày đầu tiên

let formatter = NSDateFormatter();
formatter.dateStyle = NSDateFormatterStyle.MediumStyle
formatter.timeStyle = .NoStyle
formatter.dateFormat = "MM/dd/yyyy"

Bây giờ nhận ngày từ chuỗi và ngược lại.

let strDate = formatter.stringFromDate(NSDate())
print(strDate)
let dateFromStr = formatter.dateFromString(strDate)
print(dateFromStr)

Bây giờ thưởng thức.


0

NSString thành NSDate hoặc NSDate thành NSString

//This method is used to get NSDate from string 
//Pass the date formate ex-"dd-MM-yyyy hh:mm a"
+ (NSDate*)getDateFromString:(NSString *)dateString withFormate:(NSString *)formate  {

    // Converted date from date string
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
    [dateFormatter setDateFormat:formate];
    NSDate *convertedDate         = [dateFormatter dateFromString:dateString];
    return convertedDate;
}

//This method is used to get the NSString for NSDate
//Pass the date formate ex-"dd-MM-yyyy hh:mm a"
+ (NSString *)getDateStringFromDate:(NSDate *)date withFormate:(NSString *)formate {

    // Converted date from date string
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    //[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
    [dateFormatter setDateFormat:formate];
    NSString *convertedDate         = [dateFormatter stringFromDate:date];
    return convertedDate;
}

0

Các ví dụ trên không chỉ đơn giản được viết cho Swift 3.0+

Cập nhật - Swift 3.0+ - Chuyển đổi ngày thành chuỗi

let date = Date() // insert your date data here
var dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd" // add custom format if you'd like 
var dateString = dateFormatter.string(from: date)

0

Chuỗi đến ngày

var dateFormatter = DateFormatter()
dateFormatter.format = "dd/MM/yyyy"

var dateFromString: Date? = dateFormatter.date(from: dateString) //pass string here

Ngày đến chuỗi

 var dateFormatter = DateFormatter()
 dateFormatter.dateFormat = "dd-MM-yyyy"
 let newDate = dateFormatter.string(from: date) //pass Date here
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.