Format Tanggal Indonesia
Tags: php
Published: 2020-08-28 09:14:06

Ketika saya bekerja dalam ekosistem yang menggunakan data json dari drupal, saya menemukan masalah berkaitan data inputan drupal. Data tersebut berupa tanggal mulai dan akhir suatu *events*, yang berbentuk sebagai berikut; 

`date_start => <time datetime=\"2020-06-22T04:30:00Z\" class=\"datetime\">Mon, 22/06/2020 - 11:30</time>\n`

Dalam kasus saya karena pengambilan dan pengolahan data menggunakan *PHP*. Saya mencoba membuat script untuk mengolah data yang saya dapat dari drupal tersebut menjadi data yang menginformasikan hari, tanggal, dan waktu. Dimana hari dan bulan diubah ke dalam format bahasa Indonesia.

## 1. Membuat Array Tanggal
Hal pertama yang dilakukan adalah mengambil data mulai dan akhir suatu events. Dan mengolahnya menjadi data array baru yang hanya barisi data tanggal start dan end:

```php
function getArrayDateApi($data) {
    $result = array();
    foreach($data as $key => $val) {
     $date = array();
     $date['start'] = $val['date_start'];
     $date['end'] = $val['date_end'];
     $result[$key] = $date;
    }
    return $result;
}
```
Script di atas akan menhasilkan array yang berbentuk sebagai berikut:
```php
array{
 0 => array{
    'start' => '<time datetime=\"2020-06-22T04:30:00Z\" class=\"datetime\">Mon, 22/06/2020 - 11:30</time>\n',
    'end' => '<time datetime=\"2020-06-22T04:30:00Z\" class=\"datetime\">Mon, 22/06/2020 - 11:30</time>\n',
 },
 1 => array{
    'start' => '<time datetime=\"2020-06-22T04:30:00Z\" class=\"datetime\">Mon, 22/06/2020 - 11:30</time>\n',
    'end' => '<time datetime=\"2020-06-22T04:30:00Z\" class=\"datetime\">Mon, 22/06/2020 - 11:30</time>\n',
 }
};
```
## 2. Mengelompokan Data
Langkah selanjutnya adalah dengan pengelompokan data, saya akan mengelompokannya menjadi tiga data yang diantaranya; Nama hari, tanggal dan waktu. Berikut fungsi untuk menghandel pengelompokan data ini.
```php
class DateTimeFormat
{
    public $arr_start;
    public $arr_end;

    public function getArrStart($data)
    {
      $s = explode('>', $data);
      $r = preg_replace('/([a-z]+)\, (\d+\/\d+\/\d+) \- (\d+\:\d+)/is', '\1 \2 \3 ', $s[1]);
      $arr = explode(' ', $r);
      $this->arr_start = $arr;
      return $arr;
    }
}
```
Pengelompokan terjadi setelah bagian *script* `preg_replace` dilakukan `\1` untuk nama hari, `\2` untuk tanggal, dan `\3` untuk waktu. Hasil dari fungsi diatas akan berupa array karena dihandel `explode`. Array yang akan dihasilkan akan berbentuk seperti berikut:
```php
array(
  0 => 'Mon',
  1 => '22/06/2020',
  2 => '11:30',
);
```
Dan `$this` dalam fungsi mengirimkan data `$arr` ke variabel `$arr_start`. Fungsi diatas tentunya hanya untuk tanggal mulai, sehingga untuk handel tanggal akhir perlu buat hal yang sama dan mengirimkan data arraynya ke `$arr_end`.

## 3. Pengolahan Data Hari
Setelah saya mendapat data hari dalam variabel `$arr_start` atupun `$arr_end`. Langkah berikutnya saya akan mengolah data hari yang dalam kasus ini terdapat pada index `0`. saya buat fungsi berikut di dalam class yang sama:
```php 
    public function getDay()
    {
      $arr_hari = $this->getNamaHari();
      $arr_s = $this->arr_start;
      $arr_e = $this->arr_end;
      $hari_s = $arr_s['0']; // ambil data hari pada array
      $hari_s = $arr_hari[$hari_s]; //ambil data hari Indonesianya
      $hari_e = $arr_s['0'];
      $hari_e = $arr_hari[$hari_e];
      // Alur logis ketika hari start dan ending sama maka saya akan menggunakan data satu saja, yaitu hari start
      if($hari_s == $hari_e){
         $hari = $hari_s;
      }else{
         $hari = '';
      }
      return $hari;
    }
```
Pada awal script dimulai saya mengambil terlebih dahulu data nama hari berbahasa Indonesia, yang tentunya diambil dari fungsi yang saya buat sebagai berikut:
```php
    public function getNamaHari()
    {
        return array(
              'Sun' => 'Minggu',
              'Mon' => 'Senin',
              'Tue' => 'Selasa',
              'Wed' => 'Rabu',
              'Thu' => 'Kamis',
              'Fri' => 'Jumat',
              'Sat' => 'Sabtu',

        );
    }
```
## 4. Pengolahan Data Tanggal
Setelah handel data hari, selanjutnya saya dapat mengolah data tanggal yang terdapat pada index `1`. Bentuk data tanggal adalah `22/06/2020`. Fungsi yang saya buat di dalam class sebagai berikut:
```php
public function getDate()
    { 
      //#Ambil nama-nama bulan array
      $arr_bulan = $this->getNamaBulan();
      //#Ambil data tanggal array
      $arr_s = $this->arr_start;
      $arr_e = $this->arr_end;
      //#Olah data tanggal array
      $dat_s = explode('/', $arr_s['1']); // buat tanggal jadi array berdasarkan no.tgl/no.bulan/no.tahun
      $dat_e = explode('/', $arr_e['1']);
      $num_s = $dat_s['0']; //ambil data no.tgl
      $num_e = $dat_e['0'];
      $bulan_s = $dat_s['1']; // ambil data no.bulan
      $bulan_s = $arr_bulan[$bulan_s]; // kolerasikan no.bulan dalam bhs Indo
      $bulan_e = $dat_e['1'];
      $bulan_e = $arr_bulan[$bulan_e];

      //#Format keluaran data
      //11 juni 2020
      //12-14 juni 2020
      //11 juni - 12 july 2020
      if ($bulan_s == $bulan_e && $num_s == $num_e){
         $date = $num_s . ' ' . $bulan_s . ' ' . $dat_s['2'];
      } elseif ($bulan_s == $bulan_e && $num_s != $num_e){
         $date = $num_s . '-' . $num_e . ' ' . $bulan_s . ' ' . $dat_s['2'];
      } else {
         $date = $num_s . ' ' . $bulan_s . '-' . $num_e . ' ' . $bulan_e .' ' . $dat_s['2'];
      }

      return $date;
    }
```
Pemganggilan fungsi `getNamaBulan` merupakan data array untuk nama-nama bulan dalam bahasa indonesia berdasarkan angka yang didapat. Fungsinya sebagai berikut:
```php
    public function getNamaBulan()
    {
        return array(
              '01' => 'Januari',
              '02' => 'Februari',
              '03' => 'Maret',
              '04' => 'April',
              '05' => 'Mei',
              '06' => 'Juni',
              '07' => 'Juli',
              '08' => 'Agustus',
              '09' => 'September',
              '10' => 'Oktober',
              '11' => 'November',
              '12' => 'Desember',

        );
    }
```
## 5. Pengolahan Data Waktu
Bagian terakhir dari data array adalah waktu yang terdapat pada index `2`. Bagian ini data diolah melalui fungsi sebagai:
```php 
    public function getTime()
    {
      $arr_s = $this->arr_start;
      $arr_e = $this->arr_end;
      $arr_s = $arr_s[2];
      $arr_e = $arr_e[2]; 
       return $arr_s . '-' . $arr_e;
    }
```

## 6.Menggabungkan Semua Data
Langkah terakhir menggabungkan semua data menjadi satu data array yang nantinya dapat digunakan untuk pemanggilan data di template file php.
```php
public function getArrayDateFormat($data) {
    $result = array();
        foreach($data as $key => $val) {
         $date = array();
         $this->getArrStart($val['start']);
         $this->getArrEnd($val['end']);
         $date['hari'] = $this->getDay();
         $date['tanggal'] = $this->getDate();
         $date['waktu'] = $this->getTime();
         $result[$key] = $date;
        }

    return $result;
    }
```
Pada *script* saya asumsikan data akan berupa array, alias bisa banyak data untuk diolah, dan diproses dengan memanggil fungsi-fungsi pengolahan data nama hari, tanggal, dan waktu. Hasil array akan berbentuk sebagai berikut:

```php
array{
 0 => array{
    'hari' => 'Senin',
    'tanggal' => '22 Juni 2020',
    'waktu' => '11:30 -12:00',
 },
 1 => array{
    'hari' => 'Senin',
    'tanggal' => '22 Juni 2020',
    'waktu' => '11:30 -12:00',
 },
}
```
## 7. Cara Pemakaian Script
Cara menggunakannya sendiri terlebih dahulu kita `new` dulu class yang script, kemudian panggil data events dengan fungsi `getArrayDateApi`, lalu olah dengan classnya.

```php
$dateformat = new DateTimeFormat;
$res_events_se = getArrayDateApi($events);
$res_events_date = $dateformat->getArrayDateFormat($res_events_se);
```
***
Source code: [DATE Format](https://github.com/andysaktia/learnPhp/blob/master/Fiture/dateFormat.md)