• 游客 您好:

    目前「IT人巴啦啦天地」需要數個專家協助發表文章。

    只要您願意,可以直接與我 ihstat 連絡。我將會給你「專家」身份。

    成為「專家」有什麼好處?目前暫時還沒有。我也只願意提供最多10名會員有這樣的身份。

    他可能可以成為未來非常高的權限。(除了管理) 也可以獲得由浩瀚星空站提供的資源。

  • 本站不接受任何被列入廣告發文黑名單的電子信箱。如您無法註冊,可能是您使用的電子信箱為廣告黑名單信箱。正常的信箱都是可以正常註冊。

    如果您可以証實您的信箱非廣告黑名單,請自行來信 hstaryoching#gmail.com 申請。

    申請請留下您的正統名稱及信箱,並告知從何得知及想進來的理由。

  • 浩瀚星空站已經重新整合並新增新的開發小站天地。

    採用新版的xenforo 2.2.3 做為最新的站點系統。

    中文搜尋已在本站啟用成功,歡迎多加測試看看

    有問題請再回報

教學 如何應用自已的日期時間處理(casts應用)

ihstar

管理員
管理成員
其實寫這支 Cast 是之前為了應付 LARAVEL 本身的 ORM 的日期呼叫方式。
再加上,其實我當時本身也比較愛用 unixtime 來記錄時間。
所以就寫了這一支萬用的處理。
二話不說,先直接上程式碼

PHP:
<?php
namespace App\Casts;

use DateTime;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;

/**
 * 對應的日期欄位,轉換成依app設定值的本地時間
 * Class LocalDateTime
 *
 * @package App\Casts
 */
class LocalDateTime implements CastsAttributes
{
    protected $format;

    public function __construct($format = null)
    {
        $this->format = $format ?: 'Y-m-d H:i:s';
    }

    /**
     * Cast the given value.
     *
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @param  string  $key
     * @param  mixed  $value
     * @param  array  $attributes
     *
     * @return string
     * @throws \Exception
     */
    public function get($model, $key, $value, $attributes)
    {
        if (!$value) {
            return '';
        }
        if (is_numeric($value)) {
            $value = gmdate('Y-m-d H:i:s.Z', $value).'Z';
        }
        $date = new DateTime($value);
        $timezone = new \DateTimeZone(config('app.timezone'));
        $date->setTimezone($timezone);

        return $date->format($this->format);
    }

    /**
     * Prepare the given value for storage.
     *
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @param  string  $key
     * @param  array  $value
     * @param  array  $attributes
     *
     * @return array
     */
    public function set($model, $key, $value, $attributes)
    {
        return $value;
    }
}

然後記得你的LARAVEL的時區設定,一般會是在 config/app.php 中的一個 timezone 變數值。
請調整 「Asia/Taipei」或是其它你想要的時區。

這樣在ORM中,你只要如下宣告即可
PHP:
protected $casts = [       
        'created_at' => LocalDateTime::class.':Y-m-d',
        'updated_at' => LocalDateTime::class.':Y-m-d H:i:s',
];

後面就是你想要出現的日期格式。
這樣資料再輸出時,就會出現正確的時區。
就算您欄位是使用使用 unixtime 也可以正常轉換。
 

ihstar

管理員
管理成員
以上其實從12版之後,我就已經不在使用了。原因是因為後期我會用 Resource 來做輸出了。日期就可以從這邊下手處理了
 
頂部