NEWS

[C#] Cấu hình định dạng ngày tháng, thời gian trên Windows cho ứng dụng Winform

[C#] Cấu hình định dạng ngày tháng, thời gian trên Windows cho ứng dụng Winform
Đăng bởi: Thảo Meo - Lượt xem: 12484 09:19:41, 18/12/2020C#   In bài viết

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.

region_date_time_csharp

Cấu hình DateTime Format ở Windows của mình:

customize_format_datetime

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:

date_format_winform

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"); 
}

date_time_format

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.

date_time_format_chsarp

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:

date_time_format_demo

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!

DOWNLOAD SOURCE

THÔNG TIN TÁC GIẢ

BÀI VIẾT LIÊN QUAN

[C#] Cấu hình định dạng ngày tháng, thời gian trên Windows cho ứng dụng Winform
Đăng bởi: Thảo Meo - Lượt xem: 12484 09:19:41, 18/12/2020C#   In bài viết

CÁC BÀI CÙNG CHỦ ĐỀ

Đọc tiếp
.