0

[CakePHP] View : TimeHelper

Tiếp tục cùng tìm hiểu về View trong CakePHP, bài này chúng ta sẽ cùng học cách sử dụng TimeHelper. Đây là helper giúp bạn giải quyết nhanh những vấn đề liên quan đến các thông tin về thời gian. Hai điểm chính mà nó giúp được chúng ta là : 1) Giúp format các chuỗi thời gian, 2) Tiếp đến là cung cấp các hàm test time.

Có một điểm mới trong bản 2.1 là ở ngoài View bạn có thể dùng lớp CakeTime.

1) Time zone.

Có một cách sử dụng thông dụng là set timezone để match với từng user ở từng địa điểm khác nhau. Trước tiên, bạn cần bỏ comment đoạn code date_default_timezone_set('UTC'); trong file app/Config/core.php để set timezone về múi giờ GMT+0.

Kế đến là bạn cần chuẩn bị một trường trong DB của bạn để lưu trữ timzezone, điều này cho phép user chọn timezone phù hợp với địa điểm của họ. Ví dụ như đoạn code dưới, bạn sẽ thấy tùy vào địa điểm mà timezone của user sẽ khác nhau :

    echo $this->Time->format(
      'F jS, Y h:i A',
      $post['Post']['created'],
      null,
      $user['User']['time_zone']
    );
    // nếu user ở Hà Nội,tức GMT+7 : September 20th, 2014 20:38 PM
    // còn ở Bolivia, tức GMT-4 : September 20th, 2014 09:38 AM

2) Một số hàm format.

** 2.1) convert($serverTime, $timezone = NULL)**

Hàm này trả về giá trị integer, nó sẽ convert thời gian được đưa vào (timezone trên server) thành thời gian local của người dùng.

    echo $this->Time->convert(time(), 'Asia/Jakarta');
    // 1321038036

    // bạn còn có thể gọi từ lớp CakeTime như sau
    App::uses('CakeTime', 'Utility');
    echo CakeTime::convert(time(), new DateTimeZone('Asia/Jakarta'));

2.2) dayAsSql($dateString, $field_name, $timezone = NULL)

Kết quả trả về là một chuỗi có cùng format như Sql dạng như trong ví dụ dưới :

    echo $this->Time->dayAsSql('Aug 22, 2011', 'modified');
    // (modified >= '2011-08-22 00:00:00') AND
    // (modified <= '2011-08-22 23:59:59')

    //nếu bạn đưa $timezone vào
    echo $this->Time->dayAsSql('Aug 22, 2011', 'modified', 'Asian/Jakarta');
    // (modified >= '2011-08-21 00:00:00') AND
    // (modified <= '2011-08-21 23:59:59')

2.3) daysAsSql($begin, $end, $fieldName, $timezone = NULL)

Có khác chút so với hàm trên là chuỗi trả về sẽ có dạng kiểu ($field_name >= ‘2008-01-21 00:00:00’) AND ($field_name <= ‘2008-01-25 23:59:59’)

2.4) format($date, $format = NULL, $default = false, $timezone = NULL)

Hàm này sẽ dùng các options như hàm strftime() của PHP và trả về chuỗi được format.

    echo $this->Time->format('2014-09-20 11:53:00', '%B %e, %Y %H:%M %p');
    // September 20, 2014 23:17 PM

    echo $this->Time->format('+2 days', '%c');
    // kết quả là 2 ngày sau : Mon Sep 22 23:17:35 2014

2.5) fromString($dateString, $timezone = NULL)

Đây là hàm giúp bạn chuyển đổi từ chuỗi sang một con số integer của date, nó sử dụng hàm strtotime() của PHP. Ví dụ :

    echo $this->Time->fromString('Sep 20, 2014');
    // 1411138800

2.6) gmt($dateString = NULL)

Khi sử dụng hàm gmt() sẽ trả về cho bạn giờ GMT theo chuỗi date mà bạn truyền vào, nếu không có sẽ mặc định là giờ hiện tại. Cũng giống các hàm khác thì bạn có thể gọi trong View hoặc dùng tới lớp CakeTime ở ngoài View.

2.7) nice($dateString = NULL, $timezone = NULL, $format = null)

Như cái tên nice() của hàm này, nó sẽ trả về cho bạn một chuỗi thời gian theo một format "nice". Mặc định chuỗi trả về có dạng "Mon, Aug 22nd 2011, 11:53" khi bạn chỉ đưa vào $dateString. Ngoài ra, bạn có thể tự định dạng format trả về qua tham số $format.

    echo $this->Time->nice('2014-09-20 17:14:00', null, 'Hôm nay ngày %d/%m/%Y và thời gian là %H:%M');

    // Output sẽ là
    // Hôm nay ngày 20/09/2014 và thời gian là 17:14

2.8) niceShort($dateString = NULL, $timezone = NULL)

Hàm này sẽ có ít tham số hơn hàm nice() và output của nó sẽ có format ít linh hoạt hơn như sau : 'Sep 20th 2014, 17:21'. Nếu là ngày hiện tại thì sẽ là : 'Today, 17:21'. Trường hợp là ngày hôm qua : 'Yesterday, 17:21'.

2.9) serverOffset()

Khi cần lấy offset của server thì bạn dùng hàm này, nó sẽ trả về cho bạn bằng số giây.

2.10) timeAgoInWords($dateString, $options = array())

Đây là hàm sẽ có ích khi bạn đưa ra chuỗi thời gian dạng mấy năm mấy tháng mấy tuần mấy ngày trước từ khoảng thời gian $dateString đưa vào cho đến hiện tại. Cách dùng như ví dụ sau :

    echo $this->Time->timeAgoInWords(
        'Sep 20, 2013',
        array('format' => 'F jS, Y')
    );
    // output sẽ có dạng : on September 20th, 2013

Để có được chuỗi như tôi nói thì bạn cần chỉ định 'end' trong mảng $options, sao cho thời điểm end đó lớn hơn ngày hiện tại, ví dụ :

    echo $this->Time->timeAgoInWords(
        'Sep 20, 2013',
        array('format' => 'F jS, Y', 'end' => '+2year')
    );
    // Tôi viết bài ngày 23/09/2014 nên output sẽ có dạng : 1 year, 3 days ago

Ngoài ra, với 'accuracy' bạn có thể control được output, ví dụ như bạn chỉ muốn lấy đến năm thì hãy truyền vào 'accuracy' => array('year' => 'year'). Và kết quả bạn sẽ có : 1 year ago

3) Các hàm test time

Như cái tên của các hàm mà tôi liệt kê dưới đây, chúng dùng để test xem time có chính xác hay không. Tên mỗi hàm đều nói lên ý nghĩa của chúng và cách sử dụng rất đơn giản nên tôi sẽ không lấy ví dụ về tất cả.

  • isToday($dateString, $timezone = NULL)
  • isThisWeek($dateString, $timezone = NULL)
  • isThisMonth($dateString, $timezone = NULL)
  • isThisYear($dateString, $timezone = NULL)
  • wasYesterday($dateString, $timezone = NULL)
  • isTomorrow($dateString, $timezone = NULL)
  • isFuture($dateString, $timezone = NULL)
  • isPast($dateString, $timezone = NULL)
  • wasWithinLast($timeInterval, $dateString, $timezone = NULL)

Tất cả các hàm trên đều trả về giá trị true hoặc false. Hãy cùng xem một ví dụ :

    echo $this->Time->isToday('23-09-2014', NULL) ? 'yes' : 'no';
    // Kết quả sẽ là yes bởi vì hôm nay đúng là ngày 23/09/2014

Vậy là chúng ta kết thúc tìm hiểu một số hàm hữu ích của lớp TimeHelper có thể giúp định dạng format các chuỗi thời gian, dùng để kiểm tra một số trường hợp về thời gian. Hy vọng, bài viết đã giúp ích bạn ít nhiều khi tìm hiểu CakePHP.

To be continued ...


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí