หากมีคำถาม ขอให้ไปโพสต์ลง เว็บบอร์ดจีทูจีเน็ตดอตคอม ตัวใหม่แทนน่ะครับ

หรือติดต่อเข้ามาทาง Inbox ที่ เฟซบุ๊ค ผมครับ

หน้าหลัก
ข่าวสาร - บทความ ทั้งหมด
VB 6/VB.Net
ASP/ASP.Net
จับฉ่ายคอมพิวเตอร์
เรียนรู้ผ่าน Flash Movie
บทความที่มีผู้ตอบล่าสุด  
 RSS Feeds
 ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...   Download โปรแกรม RSS Reader

Forum - www.g2gnet.com
Webmaster - www.g2gnet.com
Visitors - Session views
 4 5 6 5 5 6 0

7 ธันวาคม พ.ศ.2549
598 Users On-Line.
Visitors - Page views
 7 7 1 6 4 8 7
1 กุมภาพันธ์ พ.ศ.2551

Google   
เว็บ g2gnet.com
ขนาดตัวอักษร:  

ฟังค์ชั่นที่ใช้ในการคำนวณหาค่าความแตกต่างกันของเวลา (Time)

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 17/3/2552   เวลา: 14:31
(อ่าน : 23372) 
อันที่จริงเรื่องนี้เคยตอบคำถามให้ไปแล้วแหละครับ ... เพียงแต่ว่าไม่ได้เขียนคำอธิบายเอาไว้ให้ดูกัน หลายคนก็เลยงงๆ และ สงสัยว่าที่มา ที่ไปของแนวคิดมันเป็นอย่างไร และนี่ก็คืออีกตัวอย่างหนึ่งที่ผมต้องการแสดงให้เห็นถึง "วิธีการคิด หรือ Algorithm" ซึ่งไม่ว่าเราจะใช้ตัวแปลภาษา (ระดับสูง) ตัวไหนก็ตามที วิธีการคิด มันก็ไม่ผิดแผกแตกต่างกันไปเลย ปัจจุบันนี้มีเด็กนักศึกษาที่จบไปแล้ว หรือ ที่กำลังจะจบ ซึ่งมีเป็นจำนวนมากที่ถูกฝึกมาให้ใช้โปรแกรม แต่ไม่ได้ถูกฝึกมาให้เขียนโปรแกรม ... อย่างเช่นภาษา BASIC สิ่งที่เด็กๆเหล่านี้เรียนรู้กลับไม่ใช่ภาษา BASIC แต่กลับเป็น BASIC พื้นฐานในการใช้งานโปรแกรม คือ จับโน่น ลากนี่มาวาง รัน ... จบ ... ซึ่งมันคนละ BASIC กันเลย ... แต่ก็มีหลายคนเหมือนกัน ที่มุ่งมั่น ทุ่มเท ขยัน ขวนขวาย และ แสวงหาความรู้เพิ่มเติมให้กับตัวเอง จนจบการศึกษาออกมาด้วยความมั่นใจในตัวเองสูงขึ้น ก็ขอแสดงความยินดีกับน้องนุ่น (True) น้องตุ๊ น้องทั้ง 2 ที่ผมเคยเห็นหน้าแต่ใน MSN ... ว่างๆก็ส่งเหล้ามาปลอบขวัญให้กำลังใจพี่ด้วยเด้อ 55555+ (ส่วนน้องผู้หญิงคนนึงที่ปทุมธานี ผมโยน เอ้ย มอบให้นาย Dos_Network เป็นเทรนเนอร์ให้ ไม่รู้ไปถึงไหนแล้วคร้าบบบบบ ... ให้น้องเขาได้ปริญญาบัตรน่ะ ไม่ใช่ปริญญาบุตร เอิ๊กๆๆๆๆ)
หลักการ คือ
  1. ให้หาความแตกต่างกันของเวลา 2 เวลา ด้วยคำสั่งภายใน (หรือฟังค์ชั่น) DateDiff ออกมาเป็นระดับวินาที
  2. หาความแตกต่างกันของจำนวนชั่วโมง ให้หารด้วยจำนวน 3600 วินาที (60 นาที x 60 วินาที)
  3. หาความแตกต่างกันของจำนวนนาที ให้ลบออกจากจำนวนชั่วโมงที่ต่างกันก่อน (แต่คิดเป็นวินาทีน่ะครับ) แล้วให้หารด้วยจำนวน 60 วินาที (1 นาที เท่ากับ 60 วินาที)
  4. หาความแตกต่างกันในระดับวินาที ให้ลบออกจากจำนวนชั่วโมงที่ต่างกัน (คิดเป็นวินาที) และ ลบออกด้วยจำนวนนาทีที่ต่างกัน (นี่ก็เป็นระดับวินาที)
บทความที่เกี่ยวข้อง
ฟังค์ชั่นที่ใช้ในการคำนวณหาค่าความแตกต่างระหว่างวันเดือนปี 2 ค่า
ดาวน์โหลด
ดาวน์โหลด Source Code สำหรับ MS Visual Basic 6.0 - Service Pack 6
 ดาวน์โหลด Visual Basic 6.0 SP5: Run-Time Redistribution Pack
 ดาวน์โหลด Microsoft Data Access Object (MDAC) และ Jet 4.0 Update
 ดาวน์โหลด Microsoft Visual Basic Service Pack 6
เริ่มต้นกระบวนการทำงาน

Project --> Components ...


Design Time


คุณสมบัติของ dtPicker


Run-Time


ผลลัพธ์ที่ได้จากการคำนวณเวลา

มาดูโค้ดกันเถอะ ...

Option Explicit

Private Sub cmdCalDiffTime_Click()
Dim ResultTime As String
    ' เรียกไปยังฟังค์ชั่น CalTime เพื่อส่งค่าเวลาเริ่มต้น และ สิ้นสุดไป
    ' และ ส่งค่ากลับ (Return) มาเป็นแบบ String ... คุณจะเอามาเป็นเวลาก็ได้
    ResultTime = CalTime(dtpStartTime, dtpEndTime)
    
    ' การส่งค่าว่างเปล่ากลับมา ... แสดงว่าการคำนวณล้มเหลว ไม่ต้องทำการแสดงผล
    If ResultTime <> "" Then MsgBox "จำนวนเวลาที่ต่างกัน : " & _
        ResultTime, vbOKOnly + vbInformation, "รายงานผล"
End Sub

Private Sub Form_Load()
    ' ตั้งฟอร์มให้อยู่กึ่งกลางจอภาพ ... เครื่องหมาย \ คือ การหารตัดเศษ
    ' การคำนวณแบบนี้จะเร็วกว่าการหารเอาเศษ / ... น่ะครับพี่น้อง (ติ๊บเล็กๆ)
    Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
    
    ' กำหนดค่าเวลาในการทดสอบดู
    dtpStartTime.Value = "8:30:23"
    dtpEndTime.Value = "12:46:53"
End Sub

Public Function CalTime(StartTime As Date, EndTime As Date) As String
On Error GoTo ErrHandler

Dim cHH As Long
Dim cMM As Long
Dim cSS As Long

' ทดสอบค่าก่อนว่าเวลาเริ่มต้นต้องน้อยกว่าเวลาที่สิ้นสุด
If StartTime = EndTime Then
    ' ค่าเท่ากันก็ไม่ต้องคำนวณอะไรอีกแล้ว ... เสียเวลาเปล่า 55555+
    CalTime = "0:00:00"
    Exit Function
    
' เวลาเริ่มต้นมากกว่า ก็แจ้ง Error ให้ทราบ
ElseIf StartTime > EndTime Then
    MsgBox "เวลาเริ่มต้นจะมากกว่าได้ไงล่ะพี่น้อง ... มั่วหรือเปล่า.", _
                    vbOKOnly + vbInformation, "รายงานความผิดพลาด"
    ' คืนค่าว่างเปล่ากลับ ... หรืออื่นๆก็ได้ ที่เราต้องการแจ้งกลับไปว่าทำงานล้มเหลว ...
    ' และจบโปรแกรมย่อย (Function)
    CalTime = ""
    Exit Function
End If
  
' ===============================================================================
' หลักการของการหาค่าความแตกต่างของเวลา
' ใช้การหาค่าความแตกต่างในระดับจำนวนของวินาทีทั้งหมดออกมาก่อน
' แล้วค่อยคิดตัดออกจากจำนวนชั่วโมง นาที และ วินาที ที่ต่างกัน
' 1 ชั่วโมง เท่ากับ 3600 วินาที
' 1 นาที เท่ากับ 60 วินาที
Dim SecInMinute As Integer
Dim SecInHour As Integer
SecInMinute = 60    ' จำนวน 1 นาทีเท่ากับ 60 วินาที
SecInHour = 3600    ' มาจากจำนวน 60 นาทีใน 1 ชั่วโมง คูณเข้ากับ 60 วินาทีในแต่ละนาที ดังนั้น 1 ชั่วโมง = 3600 วินาที
' ===============================================================================

' หาจำนวนชั่วโมง (Hour) ... หารตัดเศษ ( \ ) ทิ้งไปเลย ... ทำงานได้เร็วกว่าการหารเอาเศษ ( / )
' การกำหนดชนิดตัวแปรแบบเลขจำนวนเต็ม (Integer หรือ Long) มันไม่มีเลขทศนิยมอยู่แล้วครับ
' หาความแตกต่างของจำนวนชั่วโมง โดยนับเป็นวินาที จากนั้นให้หารตัดเศษด้วย (จำนวนนาที x จำนวนวินาที)
' นั่นคือ ค่าที่ได้ \ (60 นาที x 60 วินาที) ... 1 ชั่วโมงก็จะเท่ากับ 3600 วินาที
cHH = DateDiff("s", StartTime, EndTime) \ SecInHour

' หาจำนวนนาที (Minute) ...  ไล่เครื่องหมายวงเล็บให้ถูกด้วยน่ะครับ
' การใส่วงเล็บ จะมีความสำคัญที่สูงกว่าเครื่องหมาย + - * / ... อย่าลืมเด็ดขาด
' ความแตกต่างของจำนวนนาที ค่าที่ได้ให้ลบออกจากจำนวนวินาที
' จำนวนวินาทีที่ได้ ให้ลบออกจากเวลาจำนวนชั่วโมงที่ต่างกันก่อน (ชั่วโมง x วินาที)
' แล้วค่อยหารตัดเศษด้วย 60 ... เพราะ 1 นาที = 60 วินาที
cMM = (DateDiff("s", StartTime, EndTime) - (cHH * SecInHour)) \ SecInMinute

' ที่เหลือก็เป็นวินาที (Second)
' จำนวนวินาทีที่ต่างกันทั้งหมด - จำนวนชั่วโมงที่ต่างกัน - จำนวนนาทีที่ต่างกัน
' จำนวนชั่วโมงที่ต่างกัน กับ  จำนวนนาทีที่ต่างกัน เราคิดระดับเป็นวินาทีน่ะครับ ... พี่น้อง
cSS = DateDiff("s", StartTime, EndTime) - (cHH * SecInHour) - (cMM * SecInMinute)

' คืนค่ากลับให้ฟังค์ชั่น (Return ค่ากลับเป็น String)
CalTime = cHH & ":" & cMM & ":" & cSS

ExitProc:
    Exit Function

ErrHandler:
    MsgBox Err.Number & vbCrLf & Err.Description, vbOKOnly + vbInformation, "รายงานความผิดพลาด"
    Resume Next
End Function
Conclusion:
ประโยชน์ก็คงนำไปใช้ในเรื่องของการคำนวณเวลาของการทำงาน หรือ การทำงานล่วงเวลา (Over Time - OT) เป็นหลักล่ะครับ พี่น้อง ... ซึ่งจากตอนที่แล้วเป็นการคำนวณเรื่องของวันที่ ซึ่งการคำนวณจากเวลานี้ จะช่วยหาจำนวนเวลาของการทำงานข้ามวันได้อย่างไม่ยากเย็นนักหรอกครับ ... พี่น้อง

จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
Email: thongkorn@hotmail.com หรือ โทร. 08-6862-6560