Java вычисляет разницу во времени между регистрацией и выходом

Как показали другие, чтение csv происходит быстрее. Поэтому, если вы находитесь в Windows и имеете Excel, вы можете вызвать vbscript для преобразования Excel в csv, а затем прочитать csv. Я попробовал скрипт ниже, и потребовалось около 30 секунд.

# create a list with sheet numbers you want to process
sheets = map(str,range(1,6))

# convert each sheet to csv and then read it using read_csv
df={}
from subprocess import call
excel='C:\\Users\\rsignell\\OTT_Data_All_stations.xlsx'
for sheet in sheets:
    csv = 'C:\\Users\\rsignell\\test' + sheet + '.csv' 
    call(['cscript.exe', 'C:\\Users\\rsignell\\ExcelToCsv.vbs', excel, csv, sheet])
    df[sheet]=pd.read_csv(csv)

Вот небольшой фрагмент питона для создания сценария ExcelToCsv.vbs:

#write vbscript to file
vbscript="""if WScript.Arguments.Count < 3 Then
    WScript.Echo "Please specify the source and the destination files. Usage: ExcelToCsv   "
    Wscript.Quit
End If

csv_format = 6

Set objFSO = CreateObject("Scripting.FileSystemObject")

src_file = objFSO.GetAbsolutePathName(Wscript.Arguments.Item(0))
dest_file = objFSO.GetAbsolutePathName(WScript.Arguments.Item(1))
worksheet_number = CInt(WScript.Arguments.Item(2))

Dim oExcel
Set oExcel = CreateObject("Excel.Application")

Dim oBook
Set oBook = oExcel.Workbooks.Open(src_file)
oBook.Worksheets(worksheet_number).Activate

oBook.SaveAs dest_file, csv_format

oBook.Close False
oExcel.Quit
""";

f = open('ExcelToCsv.vbs','w')
f.write(vbscript.encode('utf-8'))
f.close()

Этот ответ выиграл от Преобразование XLS в CSV в командной строке и csv & amp; Импорт файлов xlsx в кадр данных pandas: проблема с скоростью

-2
задан Gary Hooi 16 January 2019 в 13:45
поделиться

3 ответа

Я добавил код в дополнение к вашему коду. Пожалуйста, проверьте и дайте мне знать, если этого достаточно для вашего требования

public class MainClass1 {

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    //Read data
    System.out.print("Clock In: ");
    String[] sTimeIn = input.nextLine().split(":");

    System.out.print("Clock Out: ");
    String[] sTimeOut = input.nextLine().split(":");

    int iHourIn = Integer.parseInt(sTimeIn[0]);
    int iMinuteIn = Integer.parseInt(sTimeIn[1]);
    int iHourOut = Integer.parseInt(sTimeOut[0]);
    int iMinuteOut = Integer.parseInt(sTimeOut[1]);

    if(iMinuteIn < iMinuteOut) {
        iMinuteIn = 60 + iMinuteIn;
        iHourIn--;
    }
    int sumHour = iHourIn - iHourOut;
    int sumMinute = iMinuteIn - iMinuteOut;

            //Display Output
            System.out.print(sumHour +"Hour "+ sumMinute + " Minute");


    }
}
0
ответ дан Sabesh 16 January 2019 в 13:45
поделиться

Вот мое предлагаемое решение, включающее некоторую простую (не идеальную) проверку входных данных. Я поместил решение внутри метода, поэтому запрос пользователя на ввод не обрабатывается

public static void calcTime(String sTimeIn, String sTimeOut) {
    final String timePattern = "[0-2][0-9]:[0-5][0-9]";

    if (sTimeIn == null || sTimeOut == null || !sTimeIn.matches(timePattern) || !sTimeIn.matches(timePattern)) {
        throw new IllegalArgumentException();
    }

    String[] timeIn = sTimeIn.split(":");
    String[] timeOut = sTimeOut.split(":");

    int inMinutes = 60 * Integer.valueOf(timeIn[0]) + Integer.valueOf(timeIn[1]);
    int outMinutes = 60 * Integer.valueOf(timeOut[0]) + Integer.valueOf(timeOut[1]);

    int diff = 0;
    if (outMinutes > inMinutes) {
        diff = outMinutes - inMinutes;
    } else if (outMinutes < inMinutes) {
        diff = outMinutes + 24 * 60 - inMinutes;
    }

    System.out.printf("Time difference between %s and %s is %d hours and %d minutes\n", sTimeIn, sTimeOut, diff / 60, diff % 60);
}

[117 ] Обновление
Вот решение на основе LocalTime и Duration

public static void calcTime2(String sTimeIn, String sTimeOut) {
    final String timePattern = "[0-2][0-9]:[0-5][0-9]";

    if (sTimeIn == null || sTimeOut == null || !sTimeIn.matches(timePattern) || !sTimeIn.matches(timePattern)) {
        throw new IllegalArgumentException();
    }

    String[] timeIn = sTimeIn.split(":");
    String[] timeOut = sTimeOut.split(":");

    LocalTime localTimeIn = LocalTime.of(Integer.valueOf(timeIn[0]), Integer.valueOf(timeIn[1]));
    LocalTime localTimeOut = LocalTime.of(Integer.valueOf(timeOut[0]), Integer.valueOf(timeOut[1]));

    Duration duration;
    if (localTimeOut.isAfter(localTimeIn)) {
        duration = Duration.between(localTimeIn, localTimeOut);
    } else {
        Duration prevDay = Duration.ofHours(24).minusHours(localTimeIn.getHour()).minusMinutes(localTimeIn.getMinute());
        Duration nextDay = Duration.between(LocalTime.MIDNIGHT, localTimeOut);
        duration = prevDay.plus(nextDay);
    }

    System.out.printf("Time difference between %s and %s is %d hours and %d minutes\n", sTimeIn, sTimeOut,
            duration.toHours(), duration.minusHours(duration.toHours()).toMinutes());     
}
0
ответ дан Joakim Danielson 16 January 2019 в 13:45
поделиться

Если вы хотите использовать LocalTime и ChronoUnit классы Java 8:

String sTimeIn = "23:15";
String sTimeOut = "1:30";
LocalTime timeIn = LocalTime.parse(sTimeIn, DateTimeFormatter.ofPattern("H:m"));
LocalTime timeOut = LocalTime.parse(sTimeOut, DateTimeFormatter.ofPattern("H:m"));
long dif = ChronoUnit.MINUTES.between(timeIn, timeOut);
if (dif < 0)
    dif += 24 * 60;
long sumHour = dif / 60;
long sumMinute = dif % 60;

System.out.println(sumHour + ":"+ sumMinute);

или в формате HH:mm:

System.out.println(String.format("%02d", sumHour) + ":"+ String.format("%02d", sumMinute));

напечатает: [118 ]

02:15
0
ответ дан forpas 16 January 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: