首页 > 其他分享 >实现“1小时前”的时间提示

实现“1小时前”的时间提示

时间:2022-09-26 09:59:53浏览次数:54  
标签:timeInterval return string 提示 实现 rdf let 小时 string1

在开发中有时需要显示类似“1小时前”发布这种,需要我们拿到时间进行计算

func compareCurrentTime(timeString: String) -> String? {
        
    // 将字符串转成Date
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss.SSS"
    dateFormatter.locale = Locale(identifier: "cn")
    guard  let timeDate = dateFormatter.date(from: timeString) else { return nil }
        
    // 计算与当前时间的时差
    var timeInterval = timeDate.timeIntervalSinceNow
    timeInterval = -timeInterval
        
    let secondsInMinute: Double = 60
    let minutesInHour: Double = 60
    let hoursInDay: Double = 24
        
    if timeInterval < secondsInMinute {
        return "刚刚"
    }
        
    let minute = timeInterval / secondsInMinute
    if minute < minutesInHour {
        return "\(minute)分钟之前"
    }
        
    let hour = minute / minutesInHour
    if hour < hoursInDay {
        return "\(hour)小时之前"
    }
        
    let day = hour / hoursInDay
    if day <= 1 {
        dateFormatter.dateFormat = "HH:mm"
        let time = dateFormatter.string(from: timeDate)
        return "昨天 \(time)"
    } else if day < 7 {
        return "\(day)天之前"
    } else {
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm"
        let time = dateFormatter.string(from: timeDate)
        return "昨天 \(time)"
    }
}

随便搜索的一个代码(希望没错),可以看出比较麻烦。在 iOS 13 之后,Apple 提供了快捷的实现方式

// 使用RelativeDateTimeFormatter
let now = Date()
let date = Date(timeInterval: 300, since: now)
let rdf = RelativeDateTimeFormatter()
rdf.dateTimeStyle = .named

let string = rdf.localizedString(for: date, relativeTo: now)
print("string:\(string)")
let string1 = rdf.localizedString(fromTimeInterval: -(3600 * 24 * 1))
print("string1:\(string1)")

// 打印结果
// string:5分钟后
// string1:昨天 

修改 rdf.dateTimeStyle 的值

rdf.dateTimeStyle = .numeric

// 打印结果
// string:5分钟后
// string1:1天前

方便是挺方便的,但是定制能力偏弱,如果对提示文字有特殊要求的话,还是需要自己实现

标签:timeInterval,return,string,提示,实现,rdf,let,小时,string1
From: https://www.cnblogs.com/4zjq/p/16729833.html

相关文章

  • pl/sql自动提示取消[]
    sqlserver2008R2如何取消表名前後的[]SQLPrompt->Options->Insertedcode->Specialcharacters->Encloseidentifierswithinsquarebrackets[]  ......
  • vue实现导行吸顶功能
     1.先绑定一个类名,用来固定的  2.js求出他的高度  3.还有一个类名     全文,直接运行肯定报错的,图片看不清楚用的<template><divclass="nav......
  • 泛型的实现浅谈
    泛型的实现浅谈来源 https://zhuanlan.zhihu.com/p/488315752来源 https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-generics/从Go引入泛型说起......
  • 2.门面Slf4j+Simple简单实现
    1.导入pom文件<!--slf4jcore使用slf4j必須添加--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.27</ver......
  • C++实现递归法求1!+2!+3!+…+n!的和
    1#define_CRT_SECURE_NO_WARNINGS2#include<iostream>34usingnamespacestd;5//用递归求某一项的阶乘的值6intfun(inti)//求第i项的值7{8......
  • C++程序实现100—999中所有的水仙花数输出
    ​提示:如果三位数ABC满足ABC=A3+B3+C3,则称其为水仙花数废话不多说,直接上代码,注意看注释要对自己负责#define_CRT_SECURE_NO_WARNINGS#include<iostream>usingna......
  • 计算空间物体包围球的两种算法实现
    1.概述在进行二维空间几何运算的之前,往往会用包围盒进行快速碰撞检测,从而筛掉一些无法碰撞到的可能。而在三维中,比较常用的就是包围球了。当然,如何计算包围球是一个问题......
  • 使用Python实现读取TXT小说文件按每一回显示打印出来
    大家好,我是皮皮。一、前言前几天在Python铂金交流群【红色基因代代传】问了一个Python处理的问题,提问截图如下:文件里边的部分截图如下:大概的需求如下所示:二、实现......
  • Springboot 之 JPA 多数据源实现
    简介微服务推崇单服务单数据库;但是还是免不了存在一个微服务连接多个数据库的情况,今天介绍一下如何使用JPA的多数据源。主要采用将不同数据库的Repository接口分别存......
  • Springboot之 Mybatis 多数据源实现
    简介上篇讲解了JPA多数据源实现;这篇讲解一下Mybatis多数据源实现。主要采用将不同数据库的Mapper接口分别存放到不同的package,Spring去扫描不同的包,注入不同的数......