PHP8 —— New String Helpers

新增了三个字符串函数,str_starts_with, str_ends_with, str_contains, PHP 的函数这么方便,很难想象竟然一直没有这几个。 str_starts_with 判断字符串是否以另一个字符串开头,在PHP7以及之前 $id = 'inv_abcdefgh'; $result = strpos($id, 'inv_') === 0; var_dump($result); // true PHP8 中可以直接这么写 $result = str_starts_with($id, 'inv_'); str_ends_with 判断字符串是否以另外一个字符串结尾,在 PHP7 及之前,比较麻烦,通常是这么写 $id = 'abcd_inv'; $result = strpos(strrev($id), strrev('_inv')) === 0; 或者 $result = substr($id, -1 * strlen('_inv')) === '_inv'; 或者上正则吧 $result = preg_match('/_inv$/', $id) === 1; 看起来都是比较麻烦的。PHP8 里面可以简化成下面这样了 $id = 'abcd_inv'; $result = str_ends_with($id, '_ind'); str_contains 字符串包含,PHP8 之前一般就是 strpos 来实现了 $url = 'https://example?for=bar'; $result = strpos($url, '?') !== FALSE; PHP8 就直接一点 $result = str_contains($url, '?');

如何获取两个日期之间的所有日期?

简介

Java 8 加入的新 Time Api可以方便的处理日期,我们不再需要引入额外的库。

本文对比一下不同版本的 Java 如何获取两个日期之间所有的日期。

Java 7

在 Java 7中,我们一般使用一个循环,使用add 方法 对 Calendar实例使用 add(Calendar.Date,1) ,直到满足条件为之。代码示例如下:

public static List<Date> getDatesBetweenUsingJava7(
  Date startDate, Date endDate) {
    List<Date> datesInRange = new ArrayList<>();
    Calendar calendar = new GregorianCalendar();
    calendar.setTime(startDate);
     
    Calendar endCalendar = new GregorianCalendar();
    endCalendar.setTime(endDate);
 
    while (calendar.before(endCalendar)) {
        Date result = calendar.getTime();
        datesInRange.add(result);
        calendar.add(Calendar.DATE, 1);
    }
    return datesInRange;
}

Java 8

在 Java 8 中,我们可以创建一个无限的 Stream,然后取需要的部分。但是需要在满足条件时结束这个无限Stream, Java 8 语言层面没有提供直接的方法(Java 9 开始有了 takeWhile 和 dropWhile),所以我们需要提前计算日期的个数,然后使用limit()来终止Stream。

public static List<LocalDate> getDatesBetweenUsingJava8(
  LocalDate startDate, LocalDate endDate) { 
  
    long numOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate); 
    return IntStream.iterate(0, i -> i + 1)
      .limit(numOfDaysBetween)
      .mapToObj(i -> startDate.plusDays(i))
      .collect(Collectors.toList()); 
}

首先我们用 between 方法获取了日期之间按天(ChronoUnit.DAYS)的差异。然后我们创建一个 int Stream,表示从开始时间之后的天数。再然后我们使用 plusDays() 把int转换成 LocalDate。最后,使用 collect 来收集。

Java 9

Java 9 直接为这个功能引入了新方法:

public static List<LocalDate> getDatesBetweenUsingJava9(
  LocalDate startDate, LocalDate endDate) {
  
    return startDate.datesUntil(endDate)
      .collect(Collectors.toList());
}

直接调用一次LocalDate.detesUnitil方法就能获取到日期范围,返回结果是一个Stream。

评论

此博客中的热门博文

D3js Data-binding basics

JavaScript 数据类型

Vue3新特性(1) —— Vite