From what you've said, on certain machines the Japanese culture is defaulting to using the Japanese calendar rather than the Gregorian calendar.
The Japanese calendar uses eras based on the reign of the Emperor, such that:
- Showa (昭和) goes from 1926/12/25 - 1989/01/07
- Heisei (平成) goes from 1989/01/08 - 2019/04/30
- Reiwa (令和) goes from 2019/05/01 - present
We can test this in code:
var jpCulture = new CultureInfo("ja-jp");
jpCulture.DateTimeFormat.Calendar = new JapaneseCalendar();
// output: 昭和 63/05/11
Console.WriteLine(new DateTime(1988, 05, 11).ToString("g yyyy/MM/dd", jpCulture));
// output: 平成 20/05/11
Console.WriteLine(new DateTime(2008, 05, 11).ToString("g yyyy/MM/dd", jpCulture));
// output: 平成 31/04/30
Console.WriteLine(new DateTime(2019, 04, 30).ToString("g yyyy/MM/dd", jpCulture));
// output: 令和 01/05/01
Console.WriteLine(new DateTime(2019, 05, 01).ToString("g yyyy/MM/dd", jpCulture));
Your options here are:
- Do as Robyn suggests and have the user change their OS calendar setting to Gregorian (the user's current setting will be 和暦 - Japanese calendar - and needs to be changed to 西暦 - Western calendar).

- Explicitly format the date using the Invariant culture:
string myDateString = DateTime.Now.ToString("yyyy/MM/dd", CultureInfo.InvariantCulture);
- At startup, enforce a culture that uses the Gregorian calendar.
Be aware that with this option, other code is free to change the "current" culture later on in the execution of your program.
CultureInfo ci = (CultureInfo)CultureInfo.CurrentCulture.Clone();
ci.DateTimeFormat.Calendar = new GregorianCalendar();
CultureInfo.CurrentCulture = ci;
CultureInfo.CurrentUICulture = ci;
- Create a wrapper method that wraps around the
ToString functionality and adds the era if the current calendar isn't Gregorian:
public static class DateTimeExtensions
{
public static string ToStringYMDWithEra(this DateTime dt)
{
string formatString = (CultureInfo.CurrentCulture.Calendar is GregorianCalendar)
? "yyyy/MM/dd"
: "gyyyy/MM/dd";
return dt.ToString(formatString);
}
}
Usage: string formattedDate = DateTime.Now.ToStringYMDWithEra();
Note that Japanese users will implicitly understand the Japanese calendar with the era attached. Everything from forms to register with a doctor to anything official uses the Japanese calendar system. For example, my driving licence has my birth year (1988) as 昭和63.