- [C#] Cách Sử Dụng DeviceId trong C# Để Tạo Khóa Cho Ứng Dụng
- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
[C#] Cấu hình định dạng ngày tháng, thời gian trên Windows cho ứng dụng Winform
Xin chào các bạn, bài viết hôm nay mình sẽ hướng dẫn các bạn cách định dạng Ngày tháng và Thời gian trên Windows và Ứng dụng trong lập trình C#, Winform.
[C#] Set config shortDate and Short Time Windows
Khi các bạn viết ứng dụng winform hay ứng dụng nào của windows, thì mặc định các control ngày tháng hay thời gian, sẽ mặc định sẽ lấy format cấu hình của máy tính.
Cấu hình DateTime Format ở Windows của mình:
Theo hình trên, thì người sử dụng cài đặt mặc định Short Date Format là: MM/dd/yyyy
Thì khi chúng ta chạy ứng dụng của mình thì các control cũng format theo định dạng đó, như hình bên dưới đây:
Các bạn xem hình ảnh trên sẽ thấy thay vì hiển thị ngày 03/12/2020 => nó lại đi hiển thị là 12/03/2020.
Nếu mặc định người dùng biết chỉnh định dạng format ngày tháng lại thì đơn giản không sao.
Nhưng mong muốn của mình là khi chạy ứng dụng của mình sẽ luôn thể hiện ở định dạng format chuẩn Việt Nam dd/MM/yyyy.
Dưới đây mình sẽ có ba cách thực hiện như sau:
Cách 1: Chỉnh Regedit của Windows về định dạng mong muốn của mình
private void button1_Click(object sender, EventArgs e)
{
RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Control Panel\International", true);
rk.SetValue("sTimeFormat", "HH:mm:ss"); // HH for 24hrs, hh for 12 hrs
}
private void button2_Click(object sender, EventArgs e)
{
RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Control Panel\International", true);
rk.SetValue("sTimeFormat", "dd/MM/yyyy");
}
Tuy nhiên, khi các bạn set theo Regedit bằng cách này, thì ngày tháng dưới Thanh Taskbar sẽ không thay đổi liền.
Mà nó chỉ thay đổi như số phút thời gian nhảy nó mới cập nhật lại định dạng.
Dưới đây là kính thưa các loại định dạng ngày tháng.
1) MM/dd/yyyy 08/22/2006
2) dddd, dd MMMM yyyy Tuesday, 22 August 2006
3) dddd, dd MMMM yyyy HH:mm Tuesday, 22 August 2006 06:30
4) dddd, dd MMMM yyyy hh:mm tt Tuesday, 22 August 2006 06:30 AM
5) dddd, dd MMMM yyyy H:mm Tuesday, 22 August 2006 6:30
6) dddd, dd MMMM yyyy h:mm tt Tuesday, 22 August 2006 6:30 AM
7) dddd, dd MMMM yyyy HH:mm:ss Tuesday, 22 August 2006 06:30:07
8) MM/dd/yyyy HH:mm 08/22/2006 06:30
9) MM/dd/yyyy hh:mm tt 08/22/2006 06:30 AM
10) MM/dd/yyyy H:mm 08/22/2006 6:30
11) MM/dd/yyyy HH:mm:ss 08/22/2006 06:30:07
12) MMMM dd August 22
13) yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK 2006-08-22T06:30:07.7199222-04:00
14) ddd, dd MMM yyyy HH':'mm':'ss 'GMT' Tue, 22 Aug 2006 06:30:07 GMT
15) yyyy'-'MM'-'dd'T'HH':'mm':'ss 2006-08-22T06:30:07
16) HH:mm 06:30
17) hh:mm tt 06:30 AM
18) H:mm 6:30
19) h:mm tt 6:30 AM
20) HH:mm:ss 06:30:07
21) yyyy'-'MM'-'dd HH':'mm':'ss'Z' 2006-08-22 06:30:07Z
22) dddd, dd MMMM yyyy HH:mm:ss Tuesday, 22 August 2006 06:30:07
23) yyyy MMMM 2006 August
Cách 2: Mình sẽ sử dụng hàm API 32 Windows để thực hiện thay đổi định dạng ngày tháng và thời gian.
Cách này khi các bạn thay đổi thì định dạng ngày tháng thời gian trong Windows sẽ thay đổi ngay lập tức.
public const int LOCALE_USER_DEFAULT = 0x00000400;
public const int LOCALE_SSHORTDATE = 0x0000001F;
public const int LOCALE_STIMEFORMAT = 0x1003;
public const int LOCALE_SSHORTTIME = 0x0079;
public const int BSF_QUERY = 0x00000001;
public const int BSF_IGNORECURRENTTASK = 0x00000002;
public const int BSF_FLUSHDISK = 0x00000004;
public const int BSF_NOHANG = 0x00000008;
public const int BSF_POSTMESSAGE = 0x00000010;
public const int BSF_FORCEIFHUNG = 0x00000020;
public const int BSF_NOTIMEOUTIFNOTHUNG = 0x00000040;
public const int BSF_MSGSRV32ISOK = unchecked((int)0x80000000);
public const int BSF_MSGSRV32ISOK_BIT = 31;
public const int BSM_ALLCOMPONENTS = 0x00000000;
public const int BSM_VXDS = 0x00000001;
public const int BSM_NETDRIVER = 0x00000002;
public const int BSM_INSTALLABLEDRIVERS = 0x00000004;
public const int BSM_APPLICATIONS = 0x00000008;
public const int BSM_ALLDESKTOPS = 0x00000010;
public const int WM_WININICHANGE = 0x001A;
[DllImport("Kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern Boolean SetLocaleInfo(int Locale, int LCType, string lpLCData);
[DllImport("User32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern int BroadcastSystemMessage(int flags, ref int lpInfo, uint Msg, uint wParam, IntPtr lParam);
+ Cấu hình ShortDate ta viết như sau:
if (SetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SSHORTDATE, "dd/MM/yyyy"))
{
int dwRecipients = BSM_APPLICATIONS | BSM_ALLDESKTOPS;
string sString = "intl";
GCHandle GCH = GCHandle.Alloc(sString, GCHandleType.Pinned);
IntPtr pString = GCH.AddrOfPinnedObject();
BroadcastSystemMessage(BSF_FORCEIFHUNG | BSF_IGNORECURRENTTASK | BSF_NOHANG | BSF_NOTIMEOUTIFNOTHUNG, ref dwRecipients, WM_WININICHANGE, 0, pString);
}
+ Cấu hình cho ShortTime:
if (SetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SSHORTTIME, "HH:mm:ss"))
{
int dwRecipients = BSM_APPLICATIONS | BSM_ALLDESKTOPS;
string sString = "intl";
GCHandle GCH = GCHandle.Alloc(sString, GCHandleType.Pinned);
IntPtr pString = GCH.AddrOfPinnedObject();
BroadcastSystemMessage(BSF_FORCEIFHUNG | BSF_IGNORECURRENTTASK | BSF_NOHANG | BSF_NOTIMEOUTIFNOTHUNG, ref dwRecipients, WM_WININICHANGE, 0, pString);
}
Cái này là mình định dạng theo chuẩn format về 24h.
Kết quả chạy như hình ảnh bên dưới đây:
Tuy nhiên trong ứng dụng, chúng ta nên thực hiện theo cách thứ 3 ở bên dưới đây:
Cách 3: Cài đặt ngày tháng và thời gian mặc định của ứng dụng khi chạy Current Thread
Thay vì chúng ta đi chỉnh định dạng ngày của người sử dụng, thì không hay, nhiều lúc người dùng vẫn mong muốn định dạng máy tính của họ là MM/dd/yyyy.
Hay bất kỳ định dạng nào. Tuy nhiên, chúng ta làm sao để khi mở ứng dụng của mình lên chạy đều thể hiện ở định dạng dd/MM/yyyy thì chúng ta sẽ sử dụng cách dưới đây nhé.
Các bạn cấu hình trực tiếp ở file Program.cs
nhé như code bên dưới đây.
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
initCulturalFormattingChanges();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
private static void initCulturalFormattingChanges()
{
CultureInfo cultureDefinition = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
cultureDefinition.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
cultureDefinition.DateTimeFormat.ShortTimePattern = "HH:mm:ss";
Thread.CurrentThread.CurrentCulture = cultureDefinition;
}
}
Thanks for watching!