首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一个内置的方式使用DateFormatter获得“太阳9月27日下午4时”格式的值?

是否有一个内置的方式使用DateFormatter获得“太阳9月27日下午4时”格式的值?
EN

Stack Overflow用户
提问于 2020-09-24 23:20:59
回答 4查看 95关注 0票数 1

我有以下格式化程序:

代码语言:javascript
复制
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .short
dateFormatter.doesRelativeDateFormatting = true

我的目标是把我的日期变成字符串,比如:

今天下午3点

明天下午3点

九月二十七日下午三时

它适用于今天或明天的日期,但对于超过该日期的日期,我希望采用以下格式:

九月二十七日太阳下午四时

当我在3天后打印dateFormatter.string(from: DATE)的结果时,我会得到以下结果:

Sep 27, 2020 at 4 PM

有什么方法可以定制dateStyle,这样我就可以得到所需的字符串了吗?我处理了.full、.short等问题,但想按我的方式定制它。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-09-26 16:23:39

下面是一个Locale-independent解决方案:

  1. 检查Date是否是相对的

为此,您可以使用日历函数、.isDateInYesterday(date:)等。

代码语言:javascript
复制
private func isDateRelative(_ date: Date) -> Bool {
    Calendar.current.isDateInYesterday(date)
        || Calendar.current.isDateInToday(date)
        || Calendar.current.isDateInTomorrow(date)
}

  1. ,如果它是相对的,则用localizedFormat中的日期替换date部件,但保持time部件不变。

DateFormatter 扩展

代码语言:javascript
复制
extension DateFormatter {
    func relativeStringWithFormat(from date: Date, localizedFormat: String) -> String {
        if isDateRelative(date) {
            return relativeDateTimeString(from: date)
        }
        let dateStr = localizedDateString(from: date, localizedFormat: localizedFormat)
        let timeStr = relativeTimeString(from: date)
        return dateStr + timeStr
    }
    
    private func relativeDateTimeString(from date: Date) -> String {
        dateStyle = .medium
        timeStyle = .short
        doesRelativeDateFormatting = true
        return string(from: date)
    }
    
    private func relativeDateString(from date: Date) -> String {
        dateStyle = .medium
        timeStyle = .none
        doesRelativeDateFormatting = true
        return string(from: date)
    }
    
    private func relativeTimeString(from date: Date) -> String {
        relativeDateTimeString(from: date).replacingOccurrences(of: relativeDateString(from: date), with: "")
    }
    
    private func localizedDateString(from date: Date, localizedFormat: String) -> String {
        setLocalizedDateFormatFromTemplate(localizedFormat)
        doesRelativeDateFormatting = false
        return string(from: date)
    }

    private func isDateRelative(_ date: Date) -> Bool {
        Calendar.current.isDateInYesterday(date)
            || Calendar.current.isDateInToday(date)
            || Calendar.current.isDateInTomorrow(date)
    }
}

测试

代码语言:javascript
复制
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US")

let today = Date()
let tomorrow = Calendar.current.date(byAdding: .day, value: 1, to: today)!
let nextWeek = Calendar.current.date(byAdding: .day, value: 7, to: today)!

let localizedFormat = "EEE d MMM"
代码语言:javascript
复制
print(dateFormatter.relativeStringWithFormat(from: today, localizedFormat: localizedFormat))
// Today at 6:20 PM
print(dateFormatter.relativeStringWithFormat(from: tomorrow, localizedFormat: localizedFormat))
// Tomorrow at 6:20 PM
print(dateFormatter.relativeStringWithFormat(from: nextWeek, localizedFormat: localizedFormat))
// Sat, Oct 3 at 6:20 PM
票数 1
EN

Stack Overflow用户

发布于 2020-09-24 23:35:11

试着这样做:

代码语言:javascript
复制
dateformater.dateformat = "E, d MMM yyyy HH:mm:ss"

产出:11 2018年9月12日14:11:54

票数 1
EN

Stack Overflow用户

发布于 2020-09-25 00:13:46

下面是一个DateFormatter子类,它应该为您提供所需的东西。请注意,我处理了“昨天”的案件,即使你没有在你的问题中提到它。还请注意,如果要显示时间,而不是仅显示小时部分,则需要调整dateFormat字符串的"ha“部分。

代码语言:javascript
复制
class MyDateFormatter: DateFormatter {
    override init() {
        super.init()
        amSymbol = "am"
        pmSymbol = "pm"
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func string(from date: Date) -> String {
        setDateFormat(forDate: date)
        return super.string(from: date)
    }

    private func setDateFormat(forDate date: Date) {
        if calendar.isDateInYesterday(date) {
            dateFormat = "'Yesterday' 'at' ha"
            return
        } else if calendar.isDateInToday(date) {
            dateFormat = "'Today' 'at' ha"
            return
        } else if calendar.isDateInTomorrow(date) {
            dateFormat = "'Tomorrow' 'at' ha"
            return
        }
        dateFormat = "E MMM d 'at' ha"
    }
}

只需像使用普通的DateFormatter一样使用它:

代码语言:javascript
复制
let formatter = MyDateFormatter()
let dateStr = formatter.string(from: Date())
print(dateStr) // Today at 12pm
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64055684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档