各地の日の出が一番早い日と日の入が一番遅い日

ここのサイトを元にして求めました。
各地のこよみ(日の出入り、月の出入り、南中時)


分単位だとこんな感じになりました。北海道の日の出はやすぎ。あと、東京もやっぱ早い。

札幌:2012/06/15-2012/06/14 3:54 2012/06/21-2012/07/02 19:18
根室:2012/06/08-2012/06/22 3:37 2012/06/21-2012/07/02 19:02
青森県(青森):2012/06/08-2012/06/20 4:05 2012/06/24-2012/07/01 19:13
秋田県(秋田):2012/06/08-2012/06/20 4:11 2012/06/25-2012/06/30 19:12
岩手県(盛岡):2012/06/08-2012/06/20 4:07 2012/06/20-2012/07/05 19:07
宮城県(仙台):2012/06/12-2012/06/15 4:12 2012/06/22-2012/07/04 19:04
山形県(山形):2012/06/06-2012/06/21 4:15 2012/06/22-2012/07/04 19:06
福島県(福島):2012/06/06-2012/06/21 4:16 2012/06/22-2012/07/04 19:04
鳥取県鳥取):2012/06/08-2012/06/18 4:47 2012/06/27-2012/06/30 19:23
島根県(松江):2012/06/07-2012/06/19 4:52 2012/06/22-2012/07/05 19:27
岡山県(岡山):2012/06/05-2012/06/21 4:51 2012/06/21-2012/07/07 19:21
広島県(広島):2012/06/09-2012/06/16 4:57 2012/06/27-2012/07/01 19:27
山口県(山口):2012/06/05-2012/06/20 5:02 2012/06/23-2012/07/05 19:30
三重県(津):2012/06/07-2012/06/18 4:40 2012/06/22-2012/07/06 19:11
滋賀県(大津):2012/06/07-2012/06/19 4:42 2012/06/26-2012/07/01 19:15
京都府(京都):2012/06/10-2012/06/16 4:42 2012/06/22-2012/07/05 19:15
大阪府(大阪):2012/06/09-2012/06/16 4:44 2012/06/22-2012/07/06 19:15
兵庫県(神戸):2012/06/04-2012/06/21 4:46 2012/06/21-2012/07/07 19:16
奈良県(奈良):2012/06/06-2012/06/19 4:43 2012/06/24-2012/07/04 19:14
和歌山県(和歌山):2012/06/06-2012/06/19 4:47 2012/06/22-2012/07/06 19:15
新潟県(新潟):2012/06/07-2012/06/20 4:21 2012/06/21-2012/07/05 19:10
富山県(富山):2012/06/06-2012/06/20 4:32 2012/06/23-2012/07/04 19:14
石川県(金沢):2012/06/10-2012/06/16 4:34 2012/06/23-2012/07/03 19:16
福井県(福井):2012/06/05-2012/06/21 4:38 2012/06/22-2012/07/05 19:16
山梨県甲府):2012/06/09-2012/06/17 4:29 2012/06/25-2012/07/02 19:06
長野県(長野):2012/06/08-2012/06/19 4:28 2012/06/23-2012/07/04 19:10
岐阜県(岐阜):2012/06/08-2012/06/17 4:37 2012/06/22-2012/07/05 19:12
静岡県(静岡):2012/06/07-2012/06/19 4:32 2012/06/21-2012/07/07 19:04
愛知県(名古屋):2012/06/09-2012/06/16 4:37 2012/06/24-2012/07/03 19:11
茨城県(水戸):2012/06/06-2012/06/21 4:20 2012/06/23-2012/07/04 19:00
栃木県(宇都宮):2012/06/11-2012/06/15 4:21 2012/06/23-2012/07/04 19:03
群馬県(前橋):2012/06/09-2012/06/17 4:25 2012/06/25-2012/07/02 19:06
埼玉県(さいたま):2012/06/11-2012/06/15 4:24 2012/06/24-2012/07/03 19:02
千葉県(千葉):2012/06/09-2012/06/17 4:23 2012/06/22-2012/07/06 18:59
東京都:2012/06/05-2012/06/21 4:25 2012/06/23-2012/07/04 19:01
神奈川県(横浜):2012/06/05-2012/06/21 4:26 2012/06/25-2012/07/02 19:01
小笠原:2012/06/05-2012/06/14 4:36 2012/06/27-2012/07/06 18:30
福岡県(福岡):2012/06/04-2012/06/20 5:08 2012/06/26-2012/07/02 19:33
佐賀県(佐賀):2012/06/06-2012/06/19 5:09 2012/06/22-2012/07/06 19:32
長崎県(長崎):2012/06/05-2012/06/18 5:12 2012/06/27-2012/07/02 19:33
熊本県(熊本):2012/06/09-2012/06/14 5:08 2012/06/22-2012/07/07 19:29
大分県(大分):2012/06/04-2012/06/20 5:04 2012/06/24-2012/07/04 19:27
宮崎県(宮崎):2012/06/05-2012/06/18 5:08 2012/06/22-2012/07/07 19:24
鹿児島県(鹿児島):2012/06/06-2012/06/17 5:12 2012/06/24-2012/07/05 19:27
沖繩県(那覇):2012/06/05-2012/06/14 5:36 2012/06/26-2012/07/07 19:26
徳島県(徳島):2012/06/05-2012/06/20 4:50 2012/06/21-2012/07/07 19:17
香川県(高松):2012/06/06-2012/06/18 4:51 2012/06/23-2012/07/05 19:20
愛媛県(松山):2012/06/11-2012/06/13 4:57 2012/06/24-2012/07/04 19:24
高知県(高知):2012/06/07-2012/06/17 4:55 2012/06/23-2012/07/05 19:20


ちなみに、これを求めるJavaコードはこんな感じ。コンパイル・実行にはNekoHTMLからnekohtml.jarとxercesImpl.jarが必要です。

package hinode;

import com.sun.org.apache.xpath.internal.XPathAPI;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.xml.transform.TransformerException;
import org.cyberneko.html.parsers.DOMParser;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Hinode {
    public static void main(String[] args) throws SAXException, IOException, TransformerException {
        String path = "http://eco.mtk.nao.ac.jp/koyomi/dni/";
        DOMParser parser = new DOMParser();
        parser.setFeature("http://xml.org/sax/features/namespaces", false);
        parser.parse(path);
        Document doc = parser.getDocument();
        NodeList linkList = XPathAPI.selectNodeList(doc, "//A");
        for(int i = 0; i < linkList.getLength(); ++i){
            String link = ((Element)linkList.item(i)).getAttribute("href");
            if(!link.startsWith("dni")) continue;
            Pattern pat = Pattern.compile("dni([0-9]+)\\.html");
            Matcher matcher = pat.matcher(link);
            if(!matcher.matches()){
                System.out.println("リンクおかしい");
            }
            String num = matcher.group(1);
            
            String minRiseDate = "";
            String maxRiseDate = "";
            String minSetDate = "";
            String maxSetDate = "";
            int earlyRise = Integer.MAX_VALUE;
            String earlyRiseStr = "";
            int lateSet = Integer.MIN_VALUE;
            String lateSetStr = "";
            for(int d = 2; d <= 3; ++d){
                parser.parse("http://eco.mtk.nao.ac.jp/koyomi/dni/2012/hdni" + num + "12" + d + ".html");
                Document data46 = parser.getDocument();
                NodeList trList = XPathAPI.selectNodeList(data46, "//TR");
                for(int j = 0; j < trList.getLength(); ++j){
                    String sunrise = trList.item(j).getChildNodes().item(2).getTextContent();
                    String sunset = trList.item(j).getChildNodes().item(10).getTextContent();
                    Pattern timePat = Pattern.compile("([0-9]+):([0-9]+)");
                    Matcher risematcher = timePat.matcher(sunrise.trim());
                    Matcher setmatcher = timePat.matcher(sunset.trim());
                    if(!risematcher.matches() || !setmatcher.matches()){
                        continue;
                    }
                    int rise = Integer.parseInt(risematcher.group(1)) * 60 + Integer.parseInt(risematcher.group(2));
                    int set = Integer.parseInt(setmatcher.group(1)) * 60 + Integer.parseInt(setmatcher.group(2));
                    if(earlyRise > rise){
                        earlyRise = rise;
                        earlyRiseStr = sunrise.trim();
                        minRiseDate = trList.item(j).getChildNodes().item(0).getTextContent();
                    }else if(earlyRise == rise){
                        maxRiseDate = trList.item(j).getChildNodes().item(0).getTextContent();
                    }
                    if(lateSet < set){
                        lateSet = set;
                        lateSetStr = sunset.trim();
                        minSetDate = trList.item(j).getChildNodes().item(0).getTextContent();
                    }else if(lateSet == set){
                        maxSetDate = trList.item(j).getChildNodes().item(0).getTextContent();
                    }
                }
            }
            System.out.printf("%s:%s-%s %s %s-%s %s%n", 
                    linkList.item(i).getTextContent(),
                    minRiseDate, maxRiseDate, earlyRiseStr, 
                    minSetDate, maxSetDate, lateSetStr);
        }
    }
}