- [C#] Hướng dẫn giải nén file *.rar với tiến trình progress bar winform
- [C#] Chia sẻ source code make Crazy Error Message Effect Bomb Windows
- [C#] Lập trình ứng dụng theo mô hình MVP Model-View-Presenter Pattern Winform
- [C#] Giới thiệu và những thứ hay ho từ thư viện System.Reactive của Microsoft
- [C#] Hướng dẫn tạo ứng dụng Chat với GPT sử dụng Open AI API
- [DEVEXPRESS] Tạo month picker trên DateEdit Winform C#
- [DATABASE] Cách sử dụng và lưu ý khi sử dụng khóa ngoại (Foreign Key) trong Sqlserver
- [C#] Garbage Collector (GC) là gì? Cách giải phóng bộ nhớ trên ứng dụng Winform khi các đối tượng không còn sử dụng
- [C#] Cách tính độ tương phản màu sắc Contrast Color mà con người có thể nhìn thấy được
- [C#] Hướng dẫn mã hóa mật khẩu tài khoản ứng dụng đúng chuẩn Men
- [C#] Sử dụng Open AI Chat GPT viết ứng dụng Count down timer có hiệu ứng trên winform
- [DATABASE] Chia sẻ dữ liệu Pantone Color sql và json api
- [SQLSERVER] Tạo mã sản phẩm tự động như: SP0001, SP0002, SP0003... sử dụng Trigger
- [C#] Hướng dẫn kiểm tra phiên bản NET Framework cài đặt ở máy tính
- [C#] Hướng dẫn đọc file excel đơn giản sử dụng thư viện Epplus
- [C#] ConcurrentBag là gì và cách sử dụng nó trong lập trình bất đồng bộ
- [C#] AutoResetEvent là gì và cách sử dụng
- [DEVEXPRESS] Chia sẻ source code cách tạo biểu đồ sơ đồ tổ chức công ty Org Chart trên Winform C#
- [C#] Hướng dẫn tạo Auto Number trên Datagridview winform
- [DATABASE] Hướng dẫn tạo Procedure String Split in Mysql
[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!