Как сделать обновления в реальном времени файла .csv Excel в Java, когда сравнение времени оценивается как истинное? - PullRequest
0 голосов
/ 14 апреля 2020

Начну с того, что я открыт для других предложений, если есть более простой способ сделать это. Моя цель - ежедневно обновлять CSV-файл с данными о запасах в 9:00 и 16:00 EST (не мой часовой пояс). Я чувствую, что я очень близко. Теперь у меня есть функция getEST, которая извлекает текущее время в часовом поясе EST (должным образом учитывает переход на летнее время) и возвращает логическое значение true / false, если это время соответствует времени открытия или закрытия, которое я зафиксировал. У меня также есть программа, создающая файл CSV и добавляющая к нему каждый раз. Мне нужно внести некоторые изменения в мой код, чтобы он автоматически выполнял мой код извлечения данных, когда эти логические флаги выводятся как true.

Я настроил его прямо сейчас, чтобы использовать счетчик сброса и сказать, что нужно подождать 7 или 17 часов в зависимости от значения этого счетчика. Поэтому мой вопрос: а) лучше ли сделать sh сброс, когда часы EST достигнут полуночи? и б) Как мне запустить программу в любое время, чтобы она выводилась в нужное время (т. е. если приложение запускается в 6 EST, оно ждет 3 часа, прежде чем извлекать данные?

Я снимаю фрагмент кода немного, так как у меня много. Дайте мне знать, будет ли полезна какая-то пропущенная часть. Я знаю, что моя инкапсуляция также может быть улучшена, просто сначала хочу, чтобы она работала, а затем измените больше переменных на private после.

public class Scheduler {

//Declare common variables
static int reset = 0;

public static void main(String[] args) {
//Manual implementation for testing purposes
DJIA obj = new DJIA();
EST tu = new EST();
obj.getDJIA();
tu.getEST();
try {
     obj.createCSV();
} catch (IOException e) {
    e.printStackTrace();
}
    ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
    Runnable runnable = new Runnable() {
        public void run()
        {
           //Moving implementation code here causes program to wait 7 hours before executing
        }
    };
    // Execute program at 9 am EST and 4 pm EST
    if(reset == 0) {
        service.schedule(runnable, 7, TimeUnit.HOURS);
        reset ++;
    }
    else {
        service.schedule(runnable, 17, TimeUnit.HOURS);
        reset = 0;
    }
}
}

public class EST {

//Make time strings usable by main class
public String est;
public String o_time;
public String c_time;
public boolean marketOpen;
public boolean marketClose;

//Gets timezone in EST
public void getEST() {
     SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); 
     dateFormat.setTimeZone(TimeZone.getTimeZone("EST5EDT")); 
     est = dateFormat.format(new Date());
     checkTime();
     //System.out.println("Current time (EST): " + est);
     //System.out.println("Is it 9 am EST? " + marketOpen);
}

//Check if the stock market is open or not, returning a boolean indicator
public void checkTime() {
    o_time = "09:00:00";
    c_time = "16:00:00";
    if(est.equals(o_time)) {
        marketOpen = true;
    }
    else {
        marketOpen = false;
    }
    if(est.equals(c_time)) {
        marketClose = true;
    }
    else {
        marketClose = false;
    }
}

}

//Snipet from DJIA class
public void makeCSV() throws IOException {
    //Create output file only if it does not already exist
    File f = new File("DJIA.csv");
    path = Paths.get("C:\\Users\\zrr81\\eclipse-workspace\\SelTest\\DJIA.csv");
    if(!f.exists()) {
        try { 
            //Create FileWriter object with file as parameter 
            String fid = "DJIA.csv";
            CSVWriter writer = new CSVWriter(new FileWriter(fid, true));
            String[] headers = "Stock, Opening Price, Closing Price".split(",");
            writer.writeNext(headers);
            writer.close();
        }catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    else {
    }
}
public void createCSV() throws IOException {
    //Insert if else logic to import to proper array
    makeCSV();
    o_values.add(stock);
    o_values.add("test");
    c_values.add("#Empty");
    c_values.add("test");

1 Ответ

0 голосов
/ 15 апреля 2020

Я смог решить эту проблему, создав новую функцию, которая вычисляет продолжительность времени между текущим временем (в EST) и временем следующего открытия / закрытия рынка, используя современную утилиту Java .time:

public class TimeUntil extends EST {

//Create commonly used EST function
EST est = new EST();
public static LocalTime d1;
public static LocalTime  d2;
public static LocalTime  d3;
public static long diff;
public int wait = 0;

//Main time calculator
public void calcTime() {
    est.getEST();
    try {
        d1 = LocalTime.parse(est.est);
        d2 = LocalTime.parse(est.o_time);
        d3 = LocalTime.parse(est.c_time);
        Duration duration = Duration.between(d1, d2);
        diff = duration.toHours();
        if(diff > 0 || diff < -7) {
            tillOpen();
        }
        else {
            tillClose();
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

public int tillOpen(){
    if(diff > 0) {
         wait = (int) diff;
         return wait;
    }
    else {
        int x = Math.abs((int) diff);
        wait = 24 - x;
        return wait;
    }
}

public int tillClose() {
    wait = Math.abs((int) diff);
    return wait;
}
}

Принимает отрицательные значения (т. Е. Сколько времени прошло с момента открытия рынка) и переводит их в положительное время, если оно прошло после закрытия рынка. Вычитая из 24, он возвращает правильное значение времени, пока рынок снова не откроется и не запустится в нужное время

...