-
Notifications
You must be signed in to change notification settings - Fork 51
Closed
Description
http://hack.sfc.keioac.jp/bustimer/
현재 자바로 기말 프로젝트를 하고있습니다. 위와같은 버스타이머 앱을 구현해서 안드로이드 앱으로 만들려 하는데요, 문제는 시간을 계산하는 게 생각보다 많이 까다롭더군요.
아래와 같은 코드파일 3개가 있습니다.
- main인 TimeTester.java
- TimeCalculator.java, 여기서 timeCalculator 함수로 다음 버스의 시간과 현재시간의 차이를 계산을 합니다. ** 질문의 편의상 여기서는 현재시점에 맞춰서 버스를 가져오지 않고 그냥 버스 하나를 특정해서 가져오고있습니다. run해보실때는 BusSchedule.weekdayTT[50] 안에 int 부분에 알맞은 숫자를 넣어주시면 될 것 같습니다.**
- 시간표가 있는 BusSchedule.java
질문은 크게 세 가지 입니다.
- 좀 더 효율적으로 시간을 계산할 수 있는 방법/API/Library 가 있을까요?
- 막차가 지나면 다음날 첫차를 가지고 와야 하는 데, 그때 날을 다음날로 만들어야 하는데요, 날짜만 옮기는게 아니라 연, 달, 날짜, 요일, 등 모든걸 한번에 다음날로 바꾸는 방법이 있을까요? 예를들어 2017/12/31에서 다음날로 넘어가면 2018/1/1 이 될텐데 이걸 조건문을 많이 써서 하는 건 너무 비효율 적인거 같아서요...
아니면 다음날의 첫차를 가져오는 더 나은 로직이 있을까요? - 만약 API나 library 를 쓰면 Eclipse에서는 구현이 가능할 텐데, Android로 넘어갔을 때도 잘 작동할 만한 건 어떤게 있을까요?
Period, Joda Time Library 등등 여러가지를 봤지만 어느게 딱 이럴 때 좋다 라는 정보 찾기가 어렵더군요.
Java나 Android 고수님들 조언 부탁드립니다.
//main
import java.text.SimpleDateFormat;
import java.util.*;
public class TimeTester {
public static void main(String[] args) {
for (int i=0; i<1200;i++ ) {
TimeCalculator.timeCalculator(); //시간계산 함수 호출
try{ Thread.sleep(1000); } //타이머니까 1초마다 갱신
catch(InterruptedException e){}
}
}
}
import java.text.SimpleDateFormat;
import java.util.*;
public class TimeCalculator {
public static void timeCalculator() {
Calendar today = Calendar.getInstance();
Date newdate = new Date();
today.setTime(newdate);
int year = today.get(Calendar.YEAR);
int month = today.get(Calendar.MONTH); // January = 0 not 1
month += 1; // Make January = 1 for our usage
int date = today.get(Calendar.DATE);
int dayOfWeek = today.get(Calendar.DAY_OF_WEEK); //1: Sunday, 2: Monday ...
int currentHour = today.get(Calendar.HOUR_OF_DAY); // 24 hour clock
int currentMin = today.get(Calendar.MINUTE);
int currentSec = today.get(Calendar.SECOND);
String nextBusTime = month+"/"+date+"/"+year+" "+ BusSchedule.weekdayTT[50].hour+":"+BusSchedule.weekdayTT[50].minute+":"+BusSchedule.weekdayTT[50].second;
String now = month+"/"+date+"/"+year+" "+currentHour+":"+currentMin+":"+currentSec;
//System.out.println(now);
//HH converts hour in 24 hours format (0-23), day calculation
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
Date d1 = null;
Date d2 = null;
try {
d1 = format.parse(nextBusTime);
d2 = format.parse(now);
//in milliseconds
long diff = d1.getTime() - d2.getTime();
long diffSeconds = diff / 1000 % 60;
long diffMinutes = diff / (60 * 1000) % 60;
long diffHours = diff / (60 * 60 * 1000) % 24;
long diffDays = diff / (24 * 60 * 60 * 1000);
System.out.print(diffDays + " days, ");
System.out.print(diffHours + " hours, ");
System.out.print(diffMinutes + " minutes, ");
System.out.print(diffSeconds + " seconds.");
System.out.println();
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.util.*;
public class BusSchedule{
//Shonandai -> SFC
public static final BusTime[] weekdayTT =
{
new BusTime(7,10,23), new BusTime(7,17,23), new BusTime(7,30,23), new BusTime(7,40,23), new BusTime(7,44,23), new BusTime(7,48,23), new BusTime(7,56,23),
new BusTime(8,4,23), new BusTime(8,12,23), new BusTime(8,20,23), new BusTime(8,24,23), new BusTime(8,28,23), new BusTime(8,40,23), new BusTime(8,49,23), new BusTime(8,59,23),
new BusTime(9,8,23), new BusTime(9,12,23), new BusTime(9,16,23), new BusTime(9,26,23), new BusTime(9,36,23), new BusTime(9,40,23), new BusTime(9,55,23),
new BusTime(10,0,23), new BusTime(10,5,23), new BusTime(10,17,23), new BusTime(10,30,23), new BusTime(10,35,23), new BusTime(10,40,23), new BusTime(10,45,23), new BusTime(10,55,23),
new BusTime(11,0,23), new BusTime(11,5,23), new BusTime(11,10,23), new BusTime(11,15,23), new BusTime(11,20,23), new BusTime(11,30,23), new BusTime(11,40,23), new BusTime(11,50,23),
new BusTime(12,10,23), new BusTime(12,20,23), new BusTime(12,25,23), new BusTime(12,30,23), new BusTime(12,35,23), new BusTime(12,40,23), new BusTime(12,50,23), new BusTime(12,55,23),
new BusTime(13,25,23), new BusTime(13,35,23),
new BusTime(14,5,23), new BusTime(14,20,23), new BusTime(14,25,23), new BusTime(14,35,23), new BusTime(14,55,23),
new BusTime(15,5,23), new BusTime(15,25,23), new BusTime(15,35,23), new BusTime(15,52,23),
new BusTime(16,5,23), new BusTime(16,27,23), new BusTime(16,33,23),
new BusTime(17,0,23), new BusTime(17,33,23), new BusTime(17,57,23),
new BusTime(18,30,23),
new BusTime(19,3,23), new BusTime(19,27,23), new BusTime(19,39,23), new BusTime(19,55,23),
new BusTime(20,5,23), new BusTime(20,25,23), new BusTime(20,35,23),
new BusTime(21,5,23), new BusTime(21,35,23),
//no bus until 13
new BusTime(13,15,24), new BusTime(13,45,24),
new BusTime(14,15,24), new BusTime(14,45,24),
new BusTime(15,15,24), new BusTime(15,45,24),
new BusTime(16,15,24), new BusTime(16,45,24),
new BusTime(17,15,24), new BusTime(17,45,24),
new BusTime(18,15,24), new BusTime(18,42,24),
new BusTime(19,17,24), new BusTime(19,45,24),
new BusTime(20,15,24), new BusTime(20,50,24),
new BusTime(21,20,24), new BusTime(21,50,24),
new BusTime(7,24,25), new BusTime(7,35,25), new BusTime(7,53,25),
new BusTime(8,1,25), new BusTime(8,9,25), new BusTime(8,17,25), new BusTime(8,35,25), new BusTime(8,45,25), new BusTime(8,55,25),
new BusTime(9,4,25), new BusTime(9,22,25), new BusTime(9,32,25), new BusTime(9,50,25),
new BusTime(10,12,25), new BusTime(10,25,25),
//no bus 11
new BusTime(12,0,25), new BusTime(12,45,25),
new BusTime(13,5,25), new BusTime(13,55,25),
//no bus 14
new BusTime(15,40,25),
new BusTime(16,0,25), new BusTime(16,10,25), new BusTime(16,21,25), new BusTime(16,39,25), new BusTime(16,52,25),
new BusTime(17,8,25), new BusTime(17,21,25), new BusTime(17,27,25), new BusTime(17,39,25), new BusTime(17,50,25),
new BusTime(18,5,25), new BusTime(18,23,25), new BusTime(18,35,25), new BusTime(18,47,25), new BusTime(18,54,25),
new BusTime(19,13,25), new BusTime(19,21,25), new BusTime(19,33,25)
};