Pythonには「 pyephem 」という天文計算用ライブラリがあります。
これを使えば任意の場所、任意の日付で日の出、日の入り時間を計算することが出来ます。
C#にもこういうライブラリは無いかな? と探してみたところ「CoordinateSharp」というのが有名みたいです。
https://coordinatesharp.com/Help/html/N_CoordinateSharp.htm
あらかじめNuGetから「CoordinateSharp」をインストールしておき、以下のコードを書きます。
using System;
using CoordinateSharp;
namespace CsharpDotNet5ConsoleSunriseCalc
{
class Program
{
// CoordinateSharpによる日の出、日の入り時間の計算
static void Main(string[] args)
{
// 2022/6/17 14:00の日時(JST)をUTC(世界標準時)に変換
var utcTime = TimeZoneInfo.ConvertTimeToUtc(new DateTime(2022, 6, 17, 14, 0, 0, DateTimeKind.Local));
// 大阪市 34.6937689300089, 135.50222337762298 の緯度経度とUTCをセット
var c = new Coordinate(34.6937689300089, 135.50222337762298, utcTime);
Console.WriteLine("緯度経度: " + c);
Console.WriteLine("秒: " + c.Latitude.Seconds);
Console.WriteLine("UTM: " + c.UTM);
//CelestialInfo.SunRiseの戻り値はNullable<DateTime> 構造体(Null許容型)なのでキャストが必要
DateTime dt1 = (DateTime)c.CelestialInfo.SunRise; //日の入り時間をDateTime型にキャスト
DateTime dt2 = (DateTime)c.CelestialInfo.SunSet; //日の出時間をDateTime型にキャスト
Console.WriteLine("日の出: " + ToJst(dt1));
Console.WriteLine("日の入り: " + ToJst(dt2));
Console.WriteLine("月の高度: " + c.CelestialInfo.MoonAltitude);
}
//UTCからJSTへ変換するメソッド
static DateTime ToJst(DateTime utc)
{
var jstZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
return TimeZoneInfo.ConvertTimeFromUtc(utc, jstZoneInfo);
}
}
}
実行結果は以下のようになります。
緯度経度: N 34o 41' 37.568" E 135o 30' 8.004"
秒: 37.56814803204
UTM: 53S 545999mE 3839198mN
日の出: 2022/06/18 4:45:57
日の入り: 2022/06/17 19:14:21
月の高度: -75.1702167296041
6/18の大阪市の日の出時間、日の入り時間、月の高度が算出されました。
ちなみに大阪市の緯度経度はGoogleマップ上で右クリックすれば確認出来ます(^_^)
「 CoordinateSharp 」の公式ヘルプには色々便利そうなクラスやメソッドが紹介されているので、興味のある方は見てみてはどうでしょうか。
