时间处理extension,Java日期处理类

很多项目中都需要显示时间,比如聊天界面消息日期、朋友圈的说说的日期等。本文提供一个Swift下的关于时间处理的extension,即NSData的扩展,主要实现功能:1.将时间戳格式化输出:今天HH:mm、昨天HH:mm、星期HH:mm、年-月-日 HH:mm等方式显示2.比较两个时间字符串的大小,也就是两个时间的早晚3.时间字符串转换时间戳4.时间戳转换时间字符串的简单方法

导语

最重要的就是使用SimpleDateFormat类进行日期格式的转换。

使用 Date 和 SimpleDateFormat 类表示时间

时间编程是我们在开发中经常要遇到,比如说时间戳的转换,根据日期更新数据,是否清除一周缓存,时间间隔计算等等,而这些点又比较零散,不容易系统的掌握iOS时间编程.此文就是通过一些经常要用到的方法作为例子,从上到下,系统的对时间编程总结.

主要方法:1.多样式格式化输出方法:

主要内容

  • Date类的使用
  • SimpleDateFormat类的使用
  • Calendar类的使用

在程序开发中,经常需要处理日期和时间的相关数据,此时我们可以使用 java.util 包中的 Date 类。这个类最主要的作用就是获取当前时间,我们来看下 Date 类的使用:

首先,从总体上把握一下跟时间编程有关的类

class func timeString(timeInterval:TimeInterval) -> String{ //如果服务端返回的时间戳精确到毫秒,需要除以1000,否则不需要 let date:NSDate = NSDate.init(timeIntervalSince1970: timeInterval/1000) let formatter = DateFormatter.init() if date.isToday() { //是今天 formatter.dateFormat = "今天HH:mm" return formatter.string(from: date as Date) }else if date.isYesterday(){ //是昨天 formatter.dateFormat = "昨天HH:mm" return formatter.string(from: date as Date) }else if date.isSameWeek(){ //是同一周 let week = date.weekdayStringFromDate() formatter.dateFormat = "HH:mm" return formatter.string(from: date as Date) }else{ formatter.dateFormat = "yyyy-MM-dd HH:mm" return formatter.string(from: date as Date) }}

具体内容

NSDateNSDateFormatterNSDateComponentsNSDateComponentFormatterNSCalendar

2.时间字符串比较早晚

Date类

在之前一直在编写简单Java类,但是所编写的数据表与简单Java类的转换里面缺少了Date数据类型,所以本部分就属于简单Java类的最后的拼版。

在Java里面提供有一个java.util.Date的类,它直接就表示当前的日期时间。

范例:取得当前的日期时间

import java.util.Date;

public class TestDemo {
    public static void main(String args[]) {
        Date date = new Date();
        System.out.println(date);  // 输出对象信息
    }
}

输出结果

Sat Sep 30 22:26:23 CST 2017

这个时候的确输出了当前的日期时间,只不过这个格式实在是难看。
一直以来强调过一个概念:long可以描述出日期时间数据,那么这一点在Date类的方法上也是可以看见的,在Date类里面定义了如下的几个重要方法:

  • 无参构造:public Date()。
  • 有参构造:public Date(long date)。
  • 转换为long型:public long getTime()。

范例:Date与long之间转换

public class TestDemo {
    public static void main(String args[]) {
        long cur = System.currentTimeMillis();
        Date date  = new Date(cur);
        System.out.println(date);
        System.out.println(date.getTime());
    }
}

输出结果

Sat Sep 30 22:36:23 CST 2017
1506782205

以后的代码编写过程之中,依然需要以上的转换操作,尤其是getTime()方法。

图片 1

图片 2

class func compareTime(startTime:NSString,endTime:NSString) -> ComparisonResult{ return startTime.compare(endTime as String)}

日期格式化:SimpleDateFormat

java.text是一个专门实现国际化程序的开发包,而SimpleDateFormat是一个专门处理格式化日期的工具类,可以将Date型的对象转换为String型的形式显示。而主要使用的是以下方法:

  • 构造方法:public SimpleDateFormat(String pattem),需要传递转换格式。
  • 将Date转换为String:public final String format(Date date)。
  • 将String转换为Date:public Date parse(String source) throws ParseException。

现在的关键就在于转换格式上,对于常见的转换单位:年(yyyy)、月(MM)、日(dd)、时(HH)、分(mm)、秒(ss)、毫秒(SSS)。

范例:将日期格式化显示(Date型数据变为String型数据)

import java.text.SimpleDateFormat;
import java.util.Date;

public class TestDemo {
    public static void main(String args[]) {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        String str = sdf.format(date);  // 将Date型变为了String型
        System.out.println(str);
    }
}

输出结果

2017-09-30 22:50:29.312

除了可以将日期变为字符串之外,也可以将字符串转换为日期。

范例:将字符串转换为日期

public class TestDemo {
    public static void main(String args[]) throws Exception {
        String str = "2011-11-11 11:11:11.111";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        Date date = sdf.parse(str);  // 将字符串变为日期型数据
        System.out.println(date);
    }
}

输出结果

Fri Nov 11 11:11:11 CST 2011

在将字符串变为日期型数据的时候,如果日期型数据给出的月不对,那么会自动进行进位。如果给定的字符串与要转换的格式不符合,那么就会出现异常。

使用 Date 类的默认无参构造方法创建出的对象就代表当前时间,我们可以直接输出 Date 对象显示当前的时间,显示的结果如下:

图片来自@EDSIOON包含了iOS时间编程的所有类,能看懂这个图基本上说明你已经掌握了时间编程.

3.时间字符串转换时间戳:

Calendar类

Date类和SimpleDate类两个往往是一起使用的,但是Calendar这个类主要是进行一些简单的日期计算的。
Calender类定义:

public abstract class Calendar 
extends Object 
implements Serializable, Cloneable, Comparable<Calendar>

这是一个抽象类,那么应该依靠子类进行对象的实例化操作。但是在这个类里面它提供有一个static方法,此方法返回的正是本类对象:public static Calendar getInstance()。

范例:取得当前日期时间

import java.util.Calendar;

public class TestDemo {
    public static void main(String args[]) {
        Calendar cal = Calendar.getInstance();  // 取得本类对象
        StringBuffer buf = new StringBuffer();
        buf.append(cal.get(Calendar.YEAR)).append("-");
        buf.append(cal.get(Calendar.MONTH)   1).append("-");  // 这个从0开始算
        buf.append(cal.get(Calendar.DAY_OF_MONTH)).append(" ");
        buf.append(cal.get(Calendar. HOUR_OF_DAY)).append(":");
        buf.append(cal.get(Calendar.MINUTE)).append(":");
        buf.append(cal.get(Calendar.SECOND));
        System.out.println(buf);
    }
}

输出结果

2017-9-30 23:9:4

但是这个类在取得的时候可以进行一些简单的计算,例如:若干天后的日期,三天后的日期。
修改代码

import java.util.Calendar;

public class TestDemo {
    public static void main(String args[]) {
        Calendar cal = Calendar.getInstance();  // 取得本类对象
        StringBuffer buf = new StringBuffer();
        buf.append(cal.get(Calendar.YEAR)).append("-");
        buf.append(cal.get(Calendar.MONTH)   1).append("-");  // 这个从0开始算
        buf.append(cal.get(Calendar.DAY_OF_MONTH)   3).append(" ");
        buf.append(cal.get(Calendar. HOUR_OF_DAY)).append(":");
        buf.append(cal.get(Calendar.MINUTE)).append(":");
        buf.append(cal.get(Calendar.SECOND));
        System.out.println(buf);
    }
}

输出结果

2017-10-3 23:12:8

如果是日期计算,要比Date容易,如果使用Date要进行天的计算,那么就需要使用long完成了。

上图可以从NSDate分成左右两边来看,你会发现无论从哪一点走都能走通,如果只有右边的话也是没有问题的.那么左边的NSCalendar是什么? NSCalendar是时间编程中的日历体系,它结合NSDateComponents把时间分解为方便我们管理的组件,使我们更直观更容易处理时间.在后面的一些例子中还会做进一步说明.

 class func timeStrChangeToTimeInterval(startTime:String,dateFormat:String?) -> TimeInterval { let formatter = DateFormatter.init() if dateFormat == nil { formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" }else{ formatter.dateFormat = dateFormat } let date = formatter.date(from: startTime)! as NSDate return date.timeIntervalSince1970}

总结

  • 以后数据库中的日期型就使用java.uitl.Date表示。
  • 代码模型:SimpleDateFormat类实现String与Date间的互相转换。

更多内容戳这里(整理好的各种文集)

图片 3

NSDate对象是对一个简单时间点的封装,表示公历的GMT时间,其实就是表示距离特定参考时间点(2001-01-01 GMT)已过去的秒数.它不但用于日期,也用于时间处理.

4.时间戳转换时间字符串简单方法

其中, Wed 代表 Wednesday (星期三), Jun 代表 June (六月), 11 代表 11 号, CST 代表 China Standard Time (中国标准时间,也就是北京时间,东八区)。

NSDate和字符串相互转换时,我们要用到格式化的概念,既NSDateFormatter类.NSDateFormatter是NSFormatter的子类,NSFormatter的用途是将数据在字符串与特定类型的对象之间转换.那么在NSDate和字符串相互转换时,要根据需求设置相对应的格式.

class func timeIntervalChangeToTimeStr(timeInterval:TimeInterval,dateFormat:String?) -> String { //如果服务端返回的时间戳精确到毫秒,需要除以1000,否则不需要 let date:NSDate = NSDate.init(timeIntervalSince1970: timeInterval/1000) let formatter = DateFormatter.init() if dateFormat == nil { formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" }else{ formatter.dateFormat = dateFormat } return formatter.string(from: date as Date)}

从上面的输出结果中,我们发现,默认的时间格式不是很友好,与我们日常看到的日期格式不太一样,如果想要按指定的格式进行显示,如 2014-06-11 09:22:30 ,那该怎么做呢?

使用date formatter style格式化输出字符串

以上提供的主要方法以类方法的方式提供,方便项目调用,当然也可以直接用对象方法,因为在Swift中如果方法前面不加访问限制的话,是全局的,比如在“格式化输出方法”调用的方法可以直接这样写:

此时就到了 java.text 包中的 SimpleDateFormat 类大显身手的时候了!!可以使用 SimpleDateFormat 来对日期时间进行格式化,如可以将日期转换为指定格式的文本,也可将文本转换为日期。

NSDate *currentDate = [NSDate date]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.locale = [NSLocale currentLocale]; dateFormatter.dateStyle = kCFDateFormatterFullStyle; NSString *convertedDate = [dateFormatter stringFromDate:currentDate]; NSLog(@"%@", convertedDate);

//是否为今天

  1. 使用 format() 方法将日期转换为指定格式的文本

Monday, February 1, 2016

func isToday() -> Bool { let calendar = Calendar.current //当前时间 let nowComponents = calendar.dateComponents([.day,.month,.year], from: Date //self let selfComponents = calendar.dateComponents([.day,.month,.year], from: self as Date) return (selfComponents.year == nowComponents.year) && (selfComponents.month == nowComponents.month) && (selfComponents.day == nowComponents.day)}

dateFormatter有两种方式可以设置格式:一种是通过一些系统预定义的日期格式化样式;另外一种是通过某些说明符来手动设置日期格式,也就是由开发者自定义格式。上面我们用到的就是系统自带的格式化样式.

//是否是昨天

图片 4

使用日期格式说明符

func isYesterday() -> Bool { let calendar = Calendar.current //当前时间 let nowComponents = calendar.dateComponents([.day], from: Date //self let selfComponents = calendar.dateComponents([.day], from: self as Date) let cmps = calendar.dateComponents([.day], from: selfComponents, to: nowComponents) return cmps.day == 1 }

代码中的 “yyyy-MM-dd HH:mm:ss” 为预定义字符串, yyyy 表示四位年, MM 表示两位月份, dd 表示两位日期, HH 表示小时(使用24小时制), mm 表示分钟, ss 表示秒,这样就指定了转换的目标格式,最后调用format()方法将时间转换为指定的格式的字符串。

  • EEEE:“星期”的全名。如需缩写,指定1-3个字符(如E,EE,EEE代表Mon)。
  • MMMM:“月份”的全名(比如October)。如需缩写,指定1-3个字符(如M,MM,MMM代表Oct)。
  • dd:某月的第几天
  • yyyy:四位字符串表示“年”
  • HH:两位字符串表示“小时”
  • mm:两位字符串表示“分钟”
  • ss:两位字符串表示“秒”
  • zzz:三位字符串表示“时区”
  • GGG:公元前BC或公元后AD

//是否同一周

运行结果:2014-06-11  09:55:48

func isSameWeek() -> Bool { let calendar = Calendar.current //当前时间 let nowComponents = calendar.dateComponents([.day,.month,.year], from: Date //self let selfComponents = calendar.dateComponents([.weekday,.month,.year], from: self as Date) return (selfComponents.year == nowComponents.year) && (selfComponents.month == nowComponents.month) && (selfComponents.weekday == nowComponents.weekday)
  1. 使用 parse() 方法将文本转换为日期
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";

//日期转换星期

2016-02-01 15:54:43

func weekdayStringFromDate() -> String { let weekdays:NSArray = ["星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"] var calendar = Calendar.init(identifier: .gregorian) let timeZone = TimeZone.init(identifier: "Asia/Shanghai") calendar.timeZone = timeZone! let theComponents = calendar.dateComponents([.weekday], from: self as Date) return weekdays.object(at: theComponents.weekday!) as! String}

图片 5

Converting from String to NSDate

这些方法在外部可以被调用,大家可以根据项目需要修改方法访问权限:方法前用fileprivate、private、public等修饰。

代码中的 “yyyy年MM月dd日 HH:mm:ss” 指定了字符串的日期格式,调用parse()方法将文本转换为日期。

NSString *dateString = @"2016-02-01 15:54:43"; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss"; NSDate *newDate = [dateFormatter dateFromString:dateString]; NSLog(@"%@", newDate);

方法调用:调用就很简单啦,首先将extension拖进项目,以格式化输出时间字符串方法调用为例:

运行结果:

2016-02-01 07:54:43 0000

timeLabel.text = NSDate.timeString(timeInterval: "1504340026000")

图片 6

注意: 过多使用NSDateFormatter将影响程序的性能,且程序中NSDateFormatter对象的时间格式基本一致,所以使用NSDateFormatter的时候尽量使用单例模式.

ps:关于时间处理的需求千奇百怪,大家可以根据需要扩展或修改一些方法,也欢迎大家跟我交流,共同进步。

一定要注意哦:

开发中,后台给我们的时间是以时间戳的格式,拿到这个时间戳后我们可能要转换成日期格式再进行其他操作,最后要给服务器上传数据的时候我们又要把日期转换成时间戳格式传给后台.

1、 调用 SimpleDateFormat 对象的 parse() 方法时可能会出现转换异常,即 ParseException ,因此需要进行异常处理

时间戳转换日期

2、 使用 Date 类时需要导入 java.util 包,使用 SimpleDateFormat 时需要导入 java.text 包

// timestamp是后台返回给我们的时间戳double dateStampInterval = timestamp/1000;expectedDate = [NSDate dateWithTimeIntervalSince1970:dateStampInterval];

日期转换成时间戳

long long expectedInterval = [currentDate timeIntervalSince1970]*1000;timeStamp = [NSString stringWithFormat:@"%lld",expectedInterval];

NSDateComponents类是一个面向对象的日期组件,封装了具体年月日、时秒分、周、季度等.我们既可以很方便的取得一个日期的具体组件,比如小时、分钟、秒、日、月、年等等,又可以指定一个日期组件.

NSDateComponents类经常和NSCalendar类搭配使用,NSCalendar真正执行NSDate和NSDateComponents间的转换。这样,我们先要获取当前的calendar。

NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *dateComponents = [calendar components:NSCalendarUnitDay|NSCalendarUnitMonth fromDate:currentDate]; NSLog(@"day=%zd, month=%zd", dateComponents.day, dateComponents.month);

day=1, month=2

date components到date对象的转换

NSDateComponents *components = [[NSDateComponents alloc] init]; components.day = 7;components.month = 2;components.year = 2016; NSDate *newDate = [calendar dateFromComponents:components]; NSLog(@"%@", newDate);

2016-02-06 16:00:00 0000

GMT = Greenwich Mean TimeCST = China Standard TimeCET = Central European Time

components.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];

2016-02-07 00:00:00 0000

先创建两个日期,date1和date2

dateFormatter.dateFormat = @"MM dd, yyyy zzz";dateString = @"02 1, 2016 GMT";NSDate *date1 = [dateFormatter dateFromString:dateString]; dateString = @"01 31, 2016 GMT";NSDate *date2 = [dateFormatter dateFromString:dateString];NSLog(@"date1:%@, date2:%@", date1, date2);// date1:2016-02-01 00:00:00  0000, date2:2016-01-31 00:00:00  0000

earlierDate 和 laterDate

// 与anotherDate比较,返回较早的那个日期// - earlierDate:anotherDate;// 与anotherDate比较,返回较晚的那个日期// - laterDate:anotherDate;NSLog(@"Earlier date is:%@", [date1 earlierDate:date2]);// Earlier date is:2016-01-31 00:00:00  0000NSLog(@"Later date is:%@", [date1 laterDate:date2]);// Later date is:2016-02-01 00:00:00  0000

另外一个日期比较方法是 NSDate 的 compare: 方法,它需要搭配使用 NSComparisonResult 枚举体。

if ([date1 compare:date2] == NSOrderedSame) { NSLog(@"Same dates"); } else if ([date1 compare:date2] == NSOrderedAscending) { NSLog(@"Date1 is Earlier than Date2"); } else if ([date1 compare:date2] == NSOrderedDescending) { NSLog(@"Date1 is Later than Date2");}

Date1 is Later than Date2

第三个比对方法有点不同,因为它用到了时间间隔(time interval)的概念。这个方法也很简单,它可以查找到每个日期的时间间隔,接下来就可以进行比对。

if ([date1 timeIntervalSinceReferenceDate] > [date2 timeIntervalSinceReferenceDate]) { NSLog(@"Date1 is Later than Date2"); } else if ([date1 timeIntervalSinceReferenceDate] < [date2 timeIntervalSinceReferenceDate]) { NSLog(@"Date1 is Earlier than Date2"); } else if ([date1 timeIntervalSinceReferenceDate] == [date2 timeIntervalSinceReferenceDate]) { NSLog(@"Same dates");}// Date1 is Later than Date2

第一种做法用到的是 NSCAlendar 类的dateByAddingUnit:value:toDate:options: 方法

NSInteger monthsToAdd = 2;NSInteger daysToAdd = 5; newDate = [calendar dateByAddingUnit:NSCalendarUnitMonth value:monthsToAdd toDate:currentDate options:NSCalendarWrapComponents];newDate = [calendar dateByAddingUnit:NSCalendarUnitDay value:daysToAdd toDate:newDate options:NSCalendarWrapComponents];NSLog(@"%@", newDate);// 2016-04-06 12:54:02  0000

第二种是用NSDateComponents类.具体做法是初始化一个 NSDateComponents 对象,并设置月份和天的信息.然后我们调用 NSCalendar 的另一个方法 dateByAddingComponents:toDate:options:,并最终获得我们需要的日期对象.

components.month = monthsToAdd;components.day = daysToAdd; newDate = [calendar dateByAddingComponents:components toDate:currentDate options:NSCalendarWrapComponents]; NSLog(@"%@", newDate);// 2016-04-06 12:57:54  0000

第三种用到 NSDate 的 dateByAddingTimeInterval: 方法

NSTimeInterval hoursToAddInSeconds = 90 * 60;newDate = [currentDate dateByAddingTimeInterval:hoursToAddInSeconds];NSLog(@"%@", newDate);// currentDate: 2016-02-02 03:29:09  0000// 2016-02-02 04:59:09  0000

注意:因为闰秒、闰年或日光节约时间的缘故,它经常会得到错误的结果.

//定义两个日期dateFormatter.dateFormat = @"HH:mm:ss MM dd, yyyy zzz";dateString = @"09:49:20 02 1, 2016 GMT";NSDate *date1 = [dateFormatter dateFromString:dateString];dateString = @"12:22:49 01 31, 2016 GMT";NSDate *date2 = [dateFormatter dateFromString:dateString]; NSLog(@"date1:%@, date2:%@", date1, date2);

第一种计算方法是利用calendar的- (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:startingDatetoDate:resultDate options:(NSCalendarOptions)opts;

NSDateComponents *diffDateComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond fromDate:date1 toDate:date2 options:NSCalendarWrapComponents];NSLog(@"The difference between dates is:%zd year,%zd month,%zd day,%zd hour, %zd minute, %zd second", diffDateComponents.year, diffDateComponents.month, diffDateComponents.day, diffDateComponents.hour, diffDateComponents.minute, diffDateComponents.second);// The difference between dates is:0 year,0 month,0 day,-21 hour, -26 minute, -31 second

第二种方法NSDateComponentsFormatter

NSDateComponentsFormatter 类,它提供了多种用于自动计算日期间隔的方法,并可以返回格式化字符串结果.

初始化一个NSDateComponentsFormatter

NSDateComponentsFormatter *dateComponentsFormatter = [[NSDateComponentsFormatter alloc] init];dateComponentsFormatter.unitsStyle = NSDateComponentsFormatterUnitsStyleFull;

stringFromTimeInterval

NSInteger interval = [date2 timeIntervalSinceDate:date1];NSString *diffDateString = [dateComponentsFormatter stringFromTimeInterval:interval]; NSLog(@"%@", diffDateString);// -21 hours, 26 minutes, 31 seconds

stringFromDate:startDate toDate:endDate;

dateComponentsFormatter.allowedUnits = NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond;NSString *autoFormattedDifference = [dateComponentsFormatter stringFromDate:date2 toDate:date1];NSLog(@"%@", autoFormattedDifference);// 0 years

上面这种写法有问题, 会crush, 报错"Specifying positional units with gaps is ambiguous, and therefore unsupported",正确写法如下:

NSInteger unitFlags = NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond; dateComponentsFormatter.allowedUnits = unitFlags;NSString *autoFormattedDifference = [dateComponentsFormatter stringFromDate:date1 toDate:date2];NSLog(@"%@", autoFormattedDifference);// -21 hours, 26 minutes, 31 seconds

当然还有一种方法,上面也有提到过,利用 timeIntervalSinceDate:全部转换成秒数,再通过一些单位换算比较也可算出间隔日期.

除了掌握这些基本知识,还应该注意到时间编程的效率问题,比如过多使用NSDateFormatter将影响程序的性能等等问题.

本文由星彩网app下载发布于计算机编程,转载请注明出处:时间处理extension,Java日期处理类

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。