祝日を取得するために何かいいものはないかと調べて見たら、カレンダーサービスさんに行き当たりました。
カレンダーサービス
jsonやxml、CSVなどに対応しているようなのですが、カレンダーサービスさん自身の結果でjsonが返ってこない。。。
xmlで行おうと思ったのですが、ライブラリのコンパイルがうまく行かず断念
ということで今回はCSV形式で取得することにしました。
HTTP 通信のライブラリはokhttpを使いました。
square.github.io
gradleに
compile 'com.squareup.okhttp3:okhttp:3.6.0'
とりあえず取ってくる範囲を固定にしました。
2015/01~2030/12
細かい設定は直接カレンダーサービスさんを触っていただければと
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
public class CalendarApi {
private static String url = "http://calendar-service.net/cal?start_year=2016&start_mon=1&end_year=2030&end_mon=12&year_style=normal&month_style=numeric&wday_style=ja&format=csv&zero_padding=1";
public static void getData(Callback callback) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
client.newCall(request).enqueue(callback);
}
}
呼び出し側
CalendarApi.getData(callback);
コールバックの前にBeanを作りました。
public class CalendarBean implements Serializable {
private String year;
private String month;
private String day;
private String j_cal;
private String j_cal_year;
private String week;
private int weekNo;
private String holidayName;
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public String getMonth() {
return month;
}
public void setMonth(String month) {
this.month = month;
}
public String getDay() {
return day;
}
public void setDay(String day) {
this.day = day;
}
public String getJ_cal() {
return j_cal;
}
public void setJ_cal(String j_cal) {
this.j_cal = j_cal;
}
public String getJ_cal_year() {
return j_cal_year;
}
public void setJ_cal_year(String j_cal_year) {
this.j_cal_year = j_cal_year;
}
public String getWeek() {
return week;
}
public void setWeek(String week) {
this.week = week;
}
public int getWeekNo() {
return weekNo;
}
public void setWeekNo(int weekNo) {
this.weekNo = weekNo;
}
public String getHolidayName() {
return holidayName;
}
public void setHolidayName(String holidayName) {
this.holidayName = holidayName;
}
}
コールバック処理
private HashMap<String,CalendarBean> beanHashMap = new HashMap<>();
private Callback callback = new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
/**
* Called when the HTTP response was successfully returned by the remote server. The callback may
* consume the response body on another thread.
* <p>
* <p>Note that transport-layer success (receiving a HTTP response code, headers and body) does
* not necessarily indicate application-layer success: {@code response} may still indicate an
* unhappy HTTP response code like 404 or 500.
*
* @param call
* @param response
*/
@Override
public void onResponse(Call call, okhttp3.Response response) throws IOException {
String[] rows = body.split("\n");
boolean first = true;
for (String row : rows) {
if (first) {
first = false;
continue;
}
String[] columns = row.split(",");
CalendarBean calendarBean = new CalendarBean();
calendarBean.setYear(columns[0]);
calendarBean.setMonth(columns[1]);
calendarBean.setDay(columns[2]);
calendarBean.setJ_cal(columns[3]);
calendarBean.setJ_cal_year(columns[4]);
calendarBean.setWeek(columns[5]);
calendarBean.setWeekNo(Integer.parseInt(columns[6]));
if (columns.length == 8) {
calendarBean.setHolidayName(columns[7]);
}
beanHashMap.put(columns[0].concat(columns[1].concat(columns[2])),calendarBean);
}
}
};
ということでyyyyMMddをキーとしたHashMapの完成です。