Tag Archive เวลา

แก้เข้า linux / windows แล้วเวลาเปลี่ยน

ถ้าเครื่องลง dual boot หลังไปใช้ linux แล้วกลับมาบูทเข้า windows จะพบว่าเวลามันจะเปลี่ยนไปหลายชั่วโมง โดยที่ไม่ได้ตั้งเวลาใหม่แต่อย่างใด ทั้ง ๆ ที่ตอนใช้ลินุกซ์เวลาก็ถูกต้องนะ

ปัญหาแบบนี้สามารถแก้ได้ง่าย ๆ โดยพิมพ์ใน terminal ด้วยสิทธิ์ root

timedatectl set-local-rtc 1

จากนั้นปัญหานี้จะหมดไปละ

สาเหตุ ในคอมพิวเตอร์มีนาฬิกาอยู่ 2 ตัว คือ 1 นาฬิกาบนแมนบอร์ด ( bios / cmos / uefi ) 2 นาฬิกาบนระบบปฏิบัติการ โดยค่าตั้งต้น linux จะคิดว่านาฬิกาบนเมนบอร์จะเป็นเวลาตาม UTC ไม่ใช่เวลาท้องถิ่น แต่วินโดวน์จะคิดว่าเป็นเวลาท้องถิ่น เวลาที่เราใช้ linux หรือ windows ต่างก็ sync เวลาใหม่ลงไปที่นาฬิกาบนแมนบอร์ด แต่เพราะว่าทั้งสองตัวเข้าใจว่าเป็นจึงเห็นเวลาเปลี่ยนไป เปลี่ยนมา

ขอบคุณวิธีและคำอธิบายจาก Wrong Time Displayed in Windows-Linux Dual Boot Setup? Here’s How to Fix it

YII2: formatter

ถ้าทำระบบที่ออกแบบให้ลูกค้าจากต่างประเทศมาใช้งานได้อย่างสดวก อาจจะต้องเปลี่ยนการแสดงผลให้ตามความเคยชินของลูกค้า อย่างเช่น วันที่ คนไทยจะใช้ d/M/Y คือ วันที่/เดือน/ปี แต่คนอเมริกันจะใช้ M/d/Y คือ เดือนมาก่อน/วันที่/ปี แต่อัฟริการใต้และฐานข้อมูลส่วนใหญจะเก็บแบบ Y-M-d คือ ปี-เดือน-วัน จะสามารเรียงข้อมูลตามวันเวลา ได้ง่ายที่สุด แต่ไม่นิยมใช้กันในชีวิตประจำวัน ซึ่งถ้าไม่สังเกตุดีๆ อาจจะเข้าใจกันผิดได้

Yii2 ได้อำนวยความสดวกในส่วนนี้ให้โดยเพียงแค่ไปที่ไฟล์ \common\config\main.php เพิ่ม

    'components' => [
...
        'formatter' => [
            'currencyCode' => 'THB',
            'dateFormat' => 'd/M/Y',
            'datetimeFormat' => 'd/M/Y H:i:s',
            'defaultTimeZone' => 'Asia/Bangkok',
            'locale' => 'th-TH',
            'sizeFormatBase' => 1024,
            'timeFormat' => 'H:i:s',
        ],
...

ก็จะสามารถใช้ความสามารถนี้ได้

เริ่มจากวันและเวลากันก่อน

$date = date('c');
echo '<br>$date = '.$date,
'<br>',
'<br>dateFormat = '.Yii::$app->formatter->dateFormat,
'<br>asDate($date) = '.Yii::$app->formatter->asDate($date),
'<br>asDate($date, \'Y-M-d\') = '.Yii::$app->formatter->asDate($date, 'Y-M-d'),
'<br>',
'<br>datetimeFormat = '.Yii::$app->formatter->datetimeFormat,
'<br>asDatetime($date) = '.Yii::$app->formatter->asDatetime($date),
'<br>asTimestamp($date) = '.Yii::$app->formatter->asTimestamp($date);

ผลที่ได้คือ
$date = 2016-05-26T19:41:22+02:00

dateFormat = d/M/Y
asDate($date) = 26/5/2016
asDate($date, ‘Y-M-d’) = 2016-5-26

datetimeFormat = d/M/Y H:i:s
asDatetime($date) = 26/5/2016 19:41:22
asTimestamp($date) = 1464284482

เงินก็สามารถเปลี่ยนการแสดงผลได้เหมือนกัน

$value = 910097693;
echo '<br>$value = '.$value,
'<br>',
'<br>currencyCode = '.Yii::$app->formatter->currencyCode,
'<br>asCurrency($value) = '.Yii::$app->formatter->asCurrency($value),
'<br>asCurrency($value, \'USD\') = '.Yii::$app->formatter->asCurrency($value, 'USD');

ผลที่ได้คือ
$value = 910097693

currencyCode = THB
asCurrency($value) = THB 910,097,693.00
asCurrency($value, ‘USD’) = USD 910,097,693.00

ขนาดไฟล์ก็สามารถแปลงได้เหมือนกัน

$value = 910097693;
echo '<br>$value = '.$value,
'<br>',
'<br>sizeFormatBase = '.Yii::$app->formatter->sizeFormatBase,
'<br>asSize($value) = '.Yii::$app->formatter->asSize($value),
'<br>asShortSize($value) = '.Yii::$app->formatter->asShortSize($value),
'<br>asSize($value, 4) = '.Yii::$app->formatter->asSize($value, 4);

ผลที่ได้คือ
$value = 910097693

sizeFormatBase = 1024
asSize($value) = 867.94 mebibytes
asShortSize($value) = 867.94 MiB
asSize($value, 4) = 867.9368 mebibytes

อ่านเพิ่มเติม

เก็บ session ทำข้อสอบออนไลน์

ตัวอย่างระบบข้อสอบ online โดยนักเรียน นักศึกษา จะต้อง login ก่อนโดยจะเก็บข้อมูลส่วนตัว และลำดับคำถามไว้ในเซคชั่น

และเพราะว่า php ตั้งเวลาไว้ให้เซคชั่นมีอายุ 20 นาที แต่มีเวลาทำข้อสอบ 120 นาที ทำให้เซคชั่นหมดเวลาไปก่อน จึงต้องใช้ jQuery มาต่ออายุให้เซคชั่นทุกๆ 10 นาที เพื่อรักษาข้อมูลเอาไว้

ไฟล์แสดงข้อสอบ (ใช้จริงๆ ควรแยก javascript ไปไว้ในอีกที่หนึ่ง)

<!DOCTYPE html>
<html>
   <head>
      <meta charset="UTF-8">
      <title>ข้อสอบ</title>
      <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
   </head>
   <body>
<?php
if (empty($_POST))
{
?>
      <div class="container">
         <h2>Vertical (basic) form</h2>
         <div class="row">
            <div class="col-md-2"><b>Stat :</b></div>
            <div class="col-md-2" id="startA"></div>
            <div class="col-md-2"><b>End :</b></div>
            <div class="col-md-2" id="endA"></div>
            <div class="col-md-2"><b>Last Update :</b></div>
            <div class="col-md-2" id="periodsA"></div>
         </div>
         <form id="examinationF" action="examination.php" method="post">
            <div class="form-group">
               <label for="name">Name :</label>
               <input type="text" name="name" id="name" class="form-control" placeholder="Enter your name">
            </div>
            <div class="form-group">
               <label for="surname">Surname :</label>
               <input type="text" name="surname" id="surname" class="form-control" placeholder="Enter your surname">
            </div>
            <div class="checkbox">
               <label><input type="checkbox" name="accept">พร้อมทำข้อสอบในเวลาที่กำหนด</label>
            </div>
            <button type="submit" class="btn btn-default">Submit</button>
         </form>
      </div>
      <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
      <script>
         $(function(){

            /* keep session */
            function sessionPostpone()
            {
               $.ajax({
                  "cache" : false,
                  "type" : "post",
                  "success" : function(datas)
                  {
                     $('#endA').text(datas.time_end);
                     $('#periodsA').text(datas.update+ '('+datas.periods+')');
                     $('#startA').text(datas.time_start);
                  },
                  "url" : "session.php"
               });
            }

            sessionPostpone();
            var interval = 1000 * 60 * 10; // every 10 minutes
            setInterval(function(){
               sessionPostpone();
            }, interval);

            /* submit form */
            var timeout = 1000 * 60 * 120; // 120 minutes
            setTimeout(function () {
               $('#examinationF').submit();
            }, timeout);

         })
      </script>
<?php
}
else
{
   echo'<h1>คำตอบของคุณคือ</h1>',
   '<pre>',print_r($_POST, true),'</pre>';
}
?>
   </body>
</html>

ไฟล์ไว้เรียกดูข้อมูล และยืดอายุ session ออกไป

<?php
session_start();

$time = new DateTime();

if(! isset($_SESSION['id']))
{
	$datas = [];
	$_SESSION['id'] = session_id();
	$_SESSION['time_start'] = $time->format('H:i:s');

	$time_end = $time->modify('+2 hour');
	$_SESSION['time_end'] = $time_end->format('H:i:s');
	$_SESSION['time_end_timestamp'] = time($time_end);
}

$period = 10;
$_SESSION['periods'] = round((strtotime($_SESSION['time_end']) - time($time)) / 60 / $period);
$_SESSION['update'] = $time->format('H:i:s');

header("Content-type: application/json; charset=utf-8");
echo json_encode($_SESSION);

สนุกกับเวลา

ครั้งหนึ่ง เพราะเรียนบอกเวลาใช้ AM. / PM. เลยคิดว่าไทยเป็นประเทศเดียวที่มีการนับเวลาแบบหนึ่งวันมี 24 ชั่วโมง อันนี้เป็นความเข้าใจผิด เพราะว่าประเทศส่วนใหญ่ใช้การนับเวลาแบบนี้เป็นเรื่องปกติ (ทำไมไม่ทำนาฬิกา 24 ชม. มาขายเยอะๆนะ) อีกอย่างก็คือ นอกจากนับ 12, 24 ชั่วโมงแล้วบ้านเรากับลาวยังมีอะไรแปลกๆ ที่ขนาดคนไทยแต่กำเนิดบางคน (ผม) ยังไม่เคยสังเกตคือเรากับลาว มีการนับแบบ 6 ชั่วโมงพวก ตีหนึ่ง ตีสอง นั่นละครับ

ทีนี้มาถึงเรื่องวันที่กันบ้าง เราเขียนวันที่ใช้ วัน เดือน ปี อเมริกาใช้ เดือน วัน ปี ( ทำเอางงประจำ วันที่ของ boss มันวันหรือเดือน ) ส่วนใหญ่ใช้ ปี เดือน วัน (อันนี้ดูผ่านๆ ก็เห็นเลยว่า อันไหนก่อนอันไหนหลัง) เวลาเขียนโปรแกรมใช้ นับเป็นจำนวนหน่วยวินาทีตั้งแต่ปี 1900 ( 13 กุมพาพันธ์ 2554 เที่ยงคืนพอดีคือ 1297576800 อันนี้ใครเห็นแล้วบอกเวลาได้ คุณควรรีบไปสอบชิงทุนอะไรก็ได้ รับรองติดแน่ๆ ) ระบบที่ผมชอบที่สุดคือ ระบบปฏิทินของฝรั่งเศสสมัยปฎิวัติ มีนักวิทยาสาสตร์ คณิตศาสตร์ เข้าร่วมหลายคนเห็นว่าการนับ 1 สัปดาห์มีเจ็ดวัน ตามจำนวนวันที่พระเจ้าสร้างโลก นะมัน คำนวณยาก (อย่าง ทำงานระหว่างเดือน กุมพาพันธ์ ถึงสิงหาคมมันกี่วัน กี่ชั่งโมงกันแน่) เลยแก้ง่ายๆ ออกกฎหมาย

1 ปี มี 10 เดือน
1 เดือน มี 10 วัน (เงินเดือนออก เร็วทันใช้)
1 วัน มี 10 ชั่วโมง
1 ชั่วโมง มี 100 นาที (ถ้าเป็น 10 นาทีจะสวยมาก)
1 นาที มี 100 วินาที

A FRENCH REPUBLICAN ORMOLU PENDULE PORTATIVE SHOWING BOTH DECIMAL AND DUODECIMAL TIME AND STRIKING DECIMAL TIMEdecimal clockคิดง่ายสุดๆ น่าเสียดายที่ยกเลิกไปแล้ว และไม่มีที่ไหนรับไปใช้ต่อ มีอะไรแปลกๆ อีกเยอะลองอ่านดูนะ เวลาของเรามันไม่เท่ากัน