วันอังคารที่ ๑๘ สิงหาคม พ.ศ. ๒๕๕๒

เพิ่มความสามารถให้ System.DateTime (DateTime Extensions)

Share this article on your facebook

จากบทความก่อนๆ ที่ผมเคยเขียนเกี่ยวกับ ฟังก์ชั่นหาวันแรกและวันสุดท้ายของเดือน (Get first and last day of month) ซึ่งเป็น Function ที่สร้างขึ้นไว้ใช้งานเอง แต่วันนี้ผมเจอเว็บของคุณ Fredrik Kalseth ผู้ที่ขยายความสามารถให้ System.DateTime ให้มีฟังก์ชันเหล่านั้นไว้ รวมทั้งอีกหลายๆ ฟังก์ชันที่เราใช้บ่อยๆ มาลองดูตัวอย่างกันครับ (ตัวอย่างข้างล่างทั้งหมด return เป็น DateTime object นะครับ มือใหม่บางคนอาจเข้าใจผิดว่าจะreturn เป็นอักษรวันที่ ซึ่งถ้าอยากได้แบบนั้นจริงๆ ก็ค่อยแปลง DateTime เป็น String อีกทีครับ)

'หาวันแรกของเดือนนี้
Now.First()

'หาวันจันทร์แรกของเดือนนี้
Now.First(DayOfWeek.Monday)

'หาวันสุดท้ายของเดือนนี้
Now.Last()

'หาวันศุกร์สุดท้ายของเดือนนี้
Now.Last(DayOfWeek.Friday)

'หาวันจันทร์ถัดไปจากวันนี้
Now.Next(DayOfWeek.Monday)

'กำหนดค่าเป็น วันนี้เวลา 17.30 น.
Now.SetTime(17, 30)

'ฟังก์ชัน SetTime มี overload 4 ตัว ให้กำหนดค่าตั้งแต่ชั่วโมงจนถึงมิลลิวินาที
SetTime(hour)
SetTime(hour, minute)
SetTime(hour, minute, second)
SetTime(hour, minute, second, millisecond)

หลังเห็นแล้วว่าน่าใช้ ขั้นต่อไปก็ไปโหลด assembly ที่ชื่อ DateTimeExtensions.dll จาก http://www.codeplex.com/DateTimeExtensions ขนาดเพียง 5 kB

เสร็จก็ add reference เข้ามาในโปรเจ็คของเรา ก็เป็นอันใช้งานได้

ช่วยลดโค้ดลงได้นิดหน่อย แบบนี้ถ้ามีคนใช้เยอะๆ ก็อยากให้ไมโครซอฟต์บรรจุฟังก์ชันเหล่านี้ลงไปใน DateTime มาตรฐานเลย..

แหล่งข้อมูลเพิ่มเติม :
DateTimeExtensions (www.CodePlex.com)
A Set of Useful Extension Methods for DateTime (Fredrik Kalseth Blog)

วันจันทร์ที่ ๑๑ พฤษภาคม พ.ศ. ๒๕๕๒

ส่งอีเมล์บน .NET 2.0 (Sending e-mail with .NET 2.0)

เรื่องการเขียนโปรแกรมส่ง e-mail ก็เป็นงานที่ต้องเจอบ่อยๆ ครับ พอดีมีคนถามเข้ามาเลยจะพยายามรวบรวมวิธีการส่งอีเมล์แบบต่างๆ มาให้ดูครับ เดิมทีใน .NET เวอร์ชั่น 1.0/1.1 กลุ่มคลาสที่เกี่ยวกับอีเมล์จะอยู่ในเนมสเปส System.Web.Mail ซึ่งไมโครซอฟท์คงพิจารณาแล้วว่า ไม่เหมาะสมแน่ถ้าให้คลาสเกี่ยวกับอีเมล์อยู่ใน System.Web เพราะมีความหมายเป็นนัยว่างานด้านอีเมล์เกี่ยวกับงานเว็บเท่านั้น ทำให้เวลาพัฒนา win app., console ฯลฯ ต้อง add reference มาเสมอ ดังนั้นใน .NET เวอร์ชั่น 2.0 ทางไมโครซอฟท์จึงเปลี่ยนให้คลาสเกี่ยวกับอีเมล์ทั้งหมดไปอยู่ในเนมสเปส System.Net เป็นการบอกว่า งานด้านอีเมล์เป็นงานด้าน network ดังนั้นเวลาอ้างเนมสเปสจึงใช้เป็น System.Net.Mail แทน ซึ่งดูเหมาะสมดีครับ
Imports System.Net
....

Dim Mail As New MailMessage()

Mail.To.Add(New MailAddress("TO1@email.com"))
Mail.To.Add(New MailAddress("TO2@email.com"))
....
Mail.CC.Add(New MailAddress("CC1@email.com"))
Mail.CC.Add(New MailAddress("CC2@email.com"))
....
Mail.BCC.Add(New MailAddress("BCC1@email.com"))
Mail.BCC.Add(New MailAddress("BCC2@email.com"))
....
Mail.From = New MailAddress("FROM@email.com")
Mail.Subject = "......"
Mail.Body = "......"
Mail.IsBodyHtml = True

Dim Smtp As New SmtpClient("smtp.email.com")
Smtp.Send(Mail)

ชื่อ SMTP server ใช้ IP แทนก็ได้นะครับ
กรณีที่ SMTP server มีการตรวจสอบสิทธิ์ ก็ให้เพิ่มโค้ดในส่วน SmtpClient เป็น
Dim Smtp As New SmtpClient("smtp.email.com")
Smtp.DeliveryMethod = SmtpDeliveryMethod.Network
Smtp.Credentials = New NetworkCredential("UserName", "Password")
Smtp.Send(Mail)

ถ้า SMTP Server กำหนดให้ใช้ SSL\TLS (SSL ใช้ port หมายเลข 465 ,TLS ใช้ port หมายเลข 587) เพิ่ม properties ใช้อ็อบเจ็คดังนี้

Dim Smtp As New SmtpClient("smtp.email.com")
Smtp.DeliveryMethod = SmtpDeliveryMethod.Network
Smtp.Credentials = New NetworkCredential("UserName", "Password")
Smtp.EnableSsl = True
Smtp.Port = 587    '465
Smtp.Send(Mail)

บางคนอาจจำเป็นต้องเปลี่ยน SMTP บ่อยๆ หรือเปลี่ยน SMTP User บ่อยๆ ก็อาจจะระบุรายละเอียดของ SMTP Server ไว้ใน Web.config หรือ app.config เลยก็ได้ครับ
<configuration>
....
<system.net>
<mailsettings>
<smtp deliverymethod="Network">
<network host="smtp.email.com" username="..." password="..." port="..." />
</smtp>
</mailsettings>
</system.net>
....
</configuration>
<-- บทความกำลังเขียนต่อ -->

แหล่งข้อมูล :
ASPAlliance.com
dotnetcurry.com
DaniWeb
velocityreviews
SMTP gmail outlook
SMTP gmail Thunderbird 2.0
geekswithblogs.net
astahost.com

วันศุกร์ที่ ๒๐ มีนาคม พ.ศ. ๒๕๕๒

ฟังก์ชั่นหาวันแรกและวันสุดท้ายของเดือน (Get first and last day of month)

คำว่าวันสุดท้ายของเดือนในที่นี้ หมายถึงวันใน data type แบบ DateTime (หรือ Date) นะครับ ไม่ใช่หมายถึงเดือนนั้นมีกี่วัน เพราะถ้าหาเดือนนั้นมีกี่วันก็แค่ใช้ Method ชื่อ DaysInMonth (พร้อมระบุปีเดือน) ก็ได้คำตอบแล้ว โค้ดข้างล่างเป็นตัวอย่างแนวทางการหาคำตอบเท่านั้น เพราะที่จริงสามารถพลิกแพลงได้หลายวิธีครับ ลองดูกันเลยครับ

'VB.NET
'หาวันแรกของเดือน จากวันปัจจุบัน
Function GetFirstDayOfMonth(ByVal CurrentDate As DateTime) As DateTime
   Return (New DateTime(CurrentDate.Year, CurrentDate.Month, 1))
End Function
'หาวันแรกของเดือน ที่เป็นวันทำงาน (จันทร์-ศุกร์) จากวันปัจจุบัน
Function GetFirstWorkingDayOfMonth(ByVal CurrentDate As DateTime) As DateTime
   With New DateTime(CurrentDate.Year, CurrentDate.Month, 1)
      If .DayOfWeek = DayOfWeek.Saturday Then
         Return .AddDays(2)
      ElseIf .DayOfWeek = DayOfWeek.Sunday Then
         Return .AddDays(1)
      Else
         Return .AddDays(0)
      End If
   End With
End Function
'หาวันสุดท้ายของเดือน จากวันปัจจุบัน
Function GetLastDayOfMonth(ByVal CurrentDate As DateTime) As DateTime
   With CurrentDate
      Return (New DateTime(.Year, .Month, Date.DaysInMonth(.Year, .Month)))
   End With
End Function
แหล่งข้อมูล :
first day of month - eggheadcafe
First and Last Day Of Month - vbforums