[API Proposal]: Add support for VietnameseLunisolarCalendar

Open
#116,577 6 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
5/5
Estimated time
Over a week
Newbie friendliness
30/100
Issue type
Feature
Clarity
Mostly clear
Activity status
Stale
Tech stack
csharp
Domain
localization

Research direction

The proposal names VietnameseLunisolarCalendar and its EastAsianLunisolarCalendar base, and links the existing Japanese, Korean, Taiwan, and Chinese calendar APIs. Start by comparing those existing calendar implementations and determine how the Vietnamese timezone affects new-moon calculations. No repository files or tests are named; done means an agreed API and correct Vietnamese lunisolar date conversions.

Written by the indexing model from the issue text.

Description

api-suggestion area-System.Globalization
Background and motivation

There are JapaneseLunisolarCalendar, KoreanLunisolarCalendar, TaiwanLunisolarCalendar, ChineseLunisolarCalendar but no VietnameseLunisolarCalendar. What's even weirder is that Japan doesn't even use Lunisolar calendar nowadays, unlike Vietnamese people who use it extensively, and celebrate Lun(isol)ar New Year and other events in Lunisolar calendar just like the other East Asian cultures

API Proposal

Since Vietnamese is in the CJKV area (Sinosphere), its calendar is also the same

public class VietnameseLunisolarCalendar : System.Globalization.EastAsianLunisolarCalendar

The only difference is the timezone that's used to calculate the new moon

API Usage
using System;
using System.Globalization;

public class VietnameseLunisolarCalendarExample
{
    public static void Main(string[] args)
    {
        VietnameseLunisolarCalendar calendar = new VietnameseLunisolarCalendar();

        // Convert a Gregorian date to VietnameseLunisolar
        DateTime gregorianDate = new DateTime(2025, 6, 12);
        int year = calendar.GetYear(gregorianDate);
        int month = calendar.GetMonth(gregorianDate);
        int day = calendar.GetDayOfMonth(gregorianDate);

        // Display the converted VietnameseLunisolar date
        Console.WriteLine($"Gregorian Date: {gregorianDate}");
        Console.WriteLine($"VietnameseLunisolar Year: {year}");
        Console.WriteLine($"VietnameseLunisolar Month: {month}");
        Console.WriteLine($"VietnameseLunisolar Day: {day}");

        // Example: Convert a VietnameseLunisolar date back to Gregorian
        int vietnameseYear = 2025;
        int vietnameseMonth = 1;
        int vietnameseDay = 1;

        DateTime vietnameseDate = calendar.ToDateTime(vietnameseYear, vietnameseMonth, vietnameseDay, 0, 0, 0, 0);
        Console.WriteLine($"VietnameseLunisolar Date (year {vietnameseYear}, month {vietnameseMonth}, day {vietnameseDay}): {vietnameseDate}");
    }
}
Alternative Designs

No response

Risks

No response

Dominant language
C#
Stars
18.3k
Forks
5.6k
PR merge metrics
PR metrics pending

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from dotnet/runtime

All issues in dotnet/runtime

Similar issues

More C# issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.