(资料图)
(推荐教程:PHP视频教程)
1.Introduction
Carbon 是php的日期处理类库(A simple PHP API extension for DateTime.)。
Carbon 继承了PHP的 Datetime 类,所以 Carbon 中没有涉及到的,但在 Datetime 中已经实现的方法都是可以使用的。
看代码
Carbon 类声明在 Carbon 命名空间下,可以通过引入命名空间的方式来代替每次输入完整的类名。
Note:如果在使用 Carbon 时,没有专门设置时区的话,默认使用 America/Toronto 的时区。
要特别留意是否使用了正确的时区,比如 Carbon 的所有差异比较都使用 UTC 或者系统设定的时区。
diffInHours($dtToronto); // 3以上进行的时间比较是在提供的 Carbon 实例所在的时区下完成的。例如作者所在的时区为 东京时间减13 小时,因此在下午一点后。Carbon::now(‘Asia/Tokyo’)->isToday() 将会返回 false ,如果在调用 now() 时设置时区为东京时区,接下来的操作都使用东京时区是说不过去的。所以在与 now() 创建的实例进行比较时,默认是在当前时区下完成的。
2.Instantiation
有好几种方式可以创建 Carbon 的实例,但是大家应该更倾向于通过这种语义化的静态方法来实现。
值得注意的是,Carbon 构造器的第二个参数被增强到了不仅限于\DateTimeZone 实例,还可以是 String、Integer (表示相对于GMT的偏移值)。举个例子来说明下 now() 方法。
tzName; // Europe/London你将会喜欢上用 parse() 方法来代替原有繁琐的构造方式
addWeeks(2); // 2008-12-15 00:00:00echo Carbon::parse("first day of December 2008")->addWeeks(2); // 2008-12-15 00:00:00类似 now() 这样直接返回 Carbon 实例的方法还有 today(), tomorrow(),yesterday(),他们都接受一个 timezone 类型的参数,最后得到的结果时间部分都是 00:00:00
下面是一些其他的 creatXXX() 形式的静态方法。绝大多数静态方法的参数是可传可不传的,如果不传的话会使用方法预设的默认值,这些预设值一般都是针对当前日期、时间、时区的。如果为传递某个必要参数,会抛出一个 InvalidArgumentException 类型的异常,用 DateTime::getLastErrors() 方法可以得到异常的详细信息。
createFromDate() 默认返回当前时间,createFromTime()日期默认是今天。crete() 所有为 null 的参数都将默认为当前对应的时间。同样,时区也默认是当前时区。如果只设置了小时数没有设置分秒那么分秒默认是 0
getMessage(); }createFromFormat() 与php的DateTime::createFromFormat。不同之处是 $dt 参数可以是 DateTImeZone 的实例或者一个时区的字符串。并且可以会返回参数异常的提示。从createXX()的源码可以看出,他们都调用了createFromFormat()方法。
toDateTimeString(); // 1975-05-21 22:00:00最后提到的这两个create方法都是处理Unix时间戳的。第一个将会返回一个等于预期时间戳的 Carbon 实例,时区可以设置也可以选用默认值。第二个方法,createFromTimestampUTC() 与第一个不同的是时区将始终是 UTC(GMT) .第一个方法的第二个示例,只是为了让这个函数的用法展现的更加明确。Negative timestamps are also allowed.
toDateTimeString(); // 1969-12-31 18:59:59echo Carbon::createFromTimestamp(-1, "Europe/London")->toDateTimeString(); // 1970-01-01 00:59:59echo Carbon::createFromTimeStampUTC(-1)->toDateTimeString(); // 1969-12-31 23:59:59copy() 方法可以copy一个已经存在的 Carbon 实例。对copy生成实例进行修改并不会影响被copy对象的本身。
diffInYears($dt->copy()->addYear()); // 1 // $dt was unchanged and still holds the value of Carbon:now()最后,当你正在使用的 DateTime 实例是通过实例化其他继承了 \DateTime 库而得到的,别怕!通过下边的方式仍然可以极其友好创建 Carbon 实例。
toDateTimeString(); // 2008-01-01 00:00:00关于毫秒的一些处理。php自带的 DateTime 类也可以设置毫秒,但是在进行日期的数学预算时并不会考虑毫秒。从 Carbon 1.12.0版本起,实例化、copy也能像 format() 方法一样支持毫秒(PHP默认的只有 Datetime::format() 支持毫秒)。
micro; // 123456echo $dt->copy()->micro; // 123456获取PHP支持的有效时间取值范围:最早时间、最晚时间
3.Localization
Carbon中,formatLocalized() 方法通过调用 strftime() 方法,弥补了php底层的 DateTime 类不支持区域化设置的缺陷。如果你已经通过使用setlocale() 方法设置过当前区域,formatLocalized($format) 方法将会按照设置的区域格式进行返回。
formatLocalized("%A %d %B %Y"); // Mittwoch 21 Mai 1975setlocale(LC_TIME, "");echo $dt->formatLocalized("%A %d %B %Y"); // Wednesday 21 May 1975diffForHumans() 的结果也会被转化成区域语言。通过Carbon::setLocale() 方法可以设置 Carbon 的区域语言。
addYear()->diffForHumans(); // in 1 Jahr Carbon::setLocale("en");注意:如果在linux系统中转换出现了问题,请仔细检查安装在本地或生产系统中语言环境
locale -a 列举出所有可用的语言环境
sudo locale-gen zh_CN.utf8 安装新的语言环境
sudo dpkg-reconfigure locales 配置启用新的语言环境,并重启
4.Testing Aids()
通过测试方法可以得到一个模拟或真实的 Carbon 实例。只有在以下情况下,主动提供的 Carbon 实例才会被特殊处理:
调用静态方法 now(),例如:Carbon::now()传给 construct 或 parse() 方法的是 null (或空字符串),例如:new Carbon(null)当传给 construct 或 parse()的是字符串 now,例如:new Carbon(‘now’)$knownDate = Carbon::create(2001, 5, 21, 12); // create testing dateCarbon::setTestNow($knownDate); // set the mock (of course this could be a real mock object)echo Carbon::now(); // 2001-05-21 12:00:00echo new Carbon(); // 2001-05-21 12:00:00echo Carbon::parse(); // 2001-05-21 12:00:00echo new Carbon("now"); // 2001-05-21 12:00:00echo Carbon::parse("now"); // 2001-05-21 12:00:00var_dump(Carbon::hasTestNow()); // bool(true)Carbon::setTestNow(); // clear the mockvar_dump(Carbon::hasTestNow()); // bool(false)echo Carbon::now();有用的例子:
class SeasonalProduct{ protected $price; public function __construct($price){ $this->price = $price; } public function getPrice() { $multiplier = 1; if (Carbon::now()->month == 12) { $multiplier = 2; } return $this->price * $multiplier; }} $product = new SeasonalProduct(100);Carbon::setTestNow(Carbon::parse("first day of March 2000"));echo $product->getPrice(); // 100Carbon::setTestNow(Carbon::parse("first day of December 2000"));echo $product->getPrice(); // 200Carbon::setTestNow(Carbon::parse("first day of May 2000"));echo $product->getPrice(); // 100Carbon::setTestNow();一些相关的用法也可以得到一个模拟的 now 实例,返回相应的模拟数据。
$knownDate = Carbon::create(2001, 5, 21, 12); // create testing dateCarbon::setTestNow($knownDate); // set the mockecho new Carbon("tomorrow"); // 2001-05-22 00:00:00 ... notice the time !echo new Carbon("yesterday"); // 2001-05-20 00:00:00echo new Carbon("next wednesday"); // 2001-05-23 00:00:00echo new Carbon("last friday"); // 2001-05-18 00:00:00echo new Carbon("this thursday"); // 2001-05-24 00:00:00Carbon::setTestNow();以下是当前支持的时间转换字
thislastnexttomorrowyesterday+-firstago值得注意的是像 next() , previous() 和 modify() 方法等相关的修改会把日期的时间部分设置成 00:00:00 。
5.Getters
获取器通过PHP的 __get() 方式实现。可以直接通过一下方式直接获取到属性的值。
$dt = Carbon::parse("2012-9-5 23:26:11.123789"); // These getters specifically return integers, ie intval()var_dump($dt->year); // int(2012)var_dump($dt->month); // int(9)var_dump($dt->day); // int(5)var_dump($dt->hour); // int(23)var_dump($dt->minute); // int(26)var_dump($dt->second); // int(11)var_dump($dt->micro); // int(123789)var_dump($dt->dayOfWeek); // int(3)var_dump($dt->dayOfYear); // int(248)var_dump($dt->weekOfMonth); // int(1)var_dump($dt->weekOfYear); // int(36)var_dump($dt->daysInMonth); // int(30)var_dump($dt->timestamp); // int(1346901971)var_dump(Carbon::createFromDate(1975, 5, 21)->age); // int(41) calculated vs now in the same tzvar_dump($dt->quarter); // int(3) // Returns an int of seconds difference from UTC (+/- sign included)var_dump(Carbon::createFromTimestampUTC(0)->offset); // int(0)var_dump(Carbon::createFromTimestamp(0)->offset); // int(-18000) // Returns an int of hours difference from UTC (+/- sign included)var_dump(Carbon::createFromTimestamp(0)->offsetHours); // int(-5) // Indicates if day light savings time is onvar_dump(Carbon::createFromDate(2012, 1, 1)->dst); // bool(false)var_dump(Carbon::createFromDate(2012, 9, 1)->dst); // bool(true) // Indicates if the instance is in the same timezone as the local timezonevar_dump(Carbon::now()->local); // bool(true)var_dump(Carbon::now("America/Vancouver")->local); // bool(false) // Indicates if the instance is in the UTC timezonevar_dump(Carbon::now()->utc); // bool(false)var_dump(Carbon::now("Europe/London")->utc); // bool(false)var_dump(Carbon::createFromTimestampUTC(0)->utc); // bool(true) // Gets the DateTimeZone instanceecho get_class(Carbon::now()->timezone); // DateTimeZoneecho get_class(Carbon::now()->tz); // DateTimeZone // Gets the DateTimeZone instance name, shortcut for ->timezone->getName()echo Carbon::now()->timezoneName; // America/Torontoecho Carbon::now()->tzName; // America/Toronto6.Setters
Setters 通过PHP的 __set() 方法实现。值得注意的是,通过这种方式设置时间戳时,时区不会相对于时间戳而改变。如果需要改变时区的话,需要针对时区单独设置。
$dt = Carbon::now(); $dt->year = 1975;$dt->month = 13; // would force year++ and month = 1$dt->month = 5;$dt->day = 21;$dt->hour = 22;$dt->minute = 32;$dt->second = 5; $dt->timestamp = 169957925; // This will not change the timezone // Set the timezone via DateTimeZone instance or string$dt->timezone = new DateTimeZone("Europe/London");$dt->timezone = "Europe/London";$dt->tz = "Europe/London";7.Fluent Setters
此处 Setters 方法的参数是必选参数,Carbon 提供了更多种设置方式可供使用。值得注意的是,所有对于时区的修改都会影响整个到 Carbon 实例。对时间戳进行修改时不会自动转换到时间戳对应的时区。
$dt = Carbon::now(); $dt->year(1975)->month(5)->day(21)->hour(22)->minute(32)->second(5)->toDateTimeString();$dt->setDate(1975, 5, 21)->setTime(22, 32, 5)->toDateTimeString();$dt->setDateTime(1975, 5, 21, 22, 32, 5)->toDateTimeString(); $dt->timestamp(169957925)->timezone("Europe/London"); $dt->tz("America/Toronto")->setTimezone("America/Vancouver");8.IsSet
当尝试调用 Carbon 实例的属性时,会首先检查该属性是否存在,存在返回 true,不存在返回 false。
var_dump(isset(Carbon::now()->iDoNotExist)); // bool(false)var_dump(isset(Carbon::now()->hour)); // bool(true)var_dump(empty(Carbon::now()->iDoNotExist)); // bool(true)var_dump(empty(Carbon::now()->year)); // bool(false)(推荐教程:PHP视频教程)
以上就是详细介绍PHP中时间处理类Carbon的用法的详细内容,更多请关注php中文网其它相关文章!