Как я вычисляю в предыдущий рабочий день в ksh сценарии оболочки?

Я вижу как минимум два нарушения правил POJO с указанным классом данных.

1) У класса есть открытый конструктор без аргументов

По умолчанию Kotlin не будет генерировать перегрузки для функций со значениями параметров по умолчанию ( https://kotlinlang.org/docs/reference/ java-to-kotlin-interop.html # overloads-generation )

Таким образом, ваш скомпилированный класс будет иметь только один конструктор с двухпараметрическим конструктором, и конструктор без аргументов не будет создан. Чтобы заставить компилятор Kotlin генерировать множественные перегрузки, нужно использовать аннотацию @JvmOverloads. В вашем случае это будет использоваться в конструкторе, поэтому нам также нужно добавить ключевое слово constructor:

data class SomeDataClass @JvmOverloads constructor

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

Поскольку вы используете ключевые слова val, сгенерированные поля будут final, и для них не будет сгенерировано никакого установщика. Таким образом, вы можете изменить val на var с, и поля больше не будут final, а также будут генерироваться правильные методы получения и установки. (Или вы можете использовать другую аннотацию, чтобы предотвратить создание геттеров и сеттеров и выставить поле таким, как оно есть https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#instance-fields ])

Таким образом, окончательный код должен быть таким:

data class SomeDataClass @JvmOverloads constructor(
    var topic: String = "",
    var message: String = ""
)

6
задан Andy Lester 22 October 2008 в 07:35
поделиться

4 ответа

Вот решение, которое не использует Perl. Это работает оба с ksh и sh.

#!/bin/ksh

diff=-1
[ `date +%u` == 1 ] && diff=-3

seconds=$((`date +%s` + $diff * 24 * 3600))
format=+%Y-%m-%d

if date --help 2>/dev/null | grep -q -- -d ; then
    # GNU date (e.g., Linux)
    date -d "1970-01-01 00:00 UTC + $seconds seconds" $format
else
    # For BSD date (e.g., Mac OS X)
    date -r $seconds $format
fi
2
ответ дан 17 December 2019 в 04:53
поделиться

Ну, если рабочий Perl рассчитывает как часть сценария, затем разработайте ответ в Perl. Следующий вопрос - что определяет рабочий день? Действительно ли Вы - магазин/хранилище, который является, открывают на Sunday? В субботу? Или 9-5 с понедельника по пятницу бизнес? Что относительно праздников?

Принятие Вы думаете с понедельника по пятницу и праздники, является временно несущественным, затем можно использовать алгоритм в Perl, который отмечает, что wday будет 0 в воскресенье до 6 в субботу, и поэтому если wday будет равняться 1, необходимо вычесть 3 * 86400 со времени (); если wday 0, необходимо вычесть 2 * 86400; и если wday равняется 6, необходимо вычесть 1 * 86400. Это - то, что Вы вошли в материал оболочки Korn - просто делают это в Perl вместо этого:

#!/bin/perl -w
use strict;
use POSIX;
use constant SECS_PER_DAY => 24 * 60 * 60;
my(@days) = (2, 3, 1, 1, 1, 1, 1);
my($now) = time;
my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($now);
print strftime("%Y-%m-%d\n", localtime($now - $days[$wday] * SECS_PER_DAY));

Это действительно предполагает, что у Вас есть модуль POSIX; в противном случае затем необходимо будет сделать примерно тот же printf (), как Вы использовали. Я также использую формат ISO 8601 для дат предпочтением (также используемый XSD и SQL) - следовательно проиллюстрированный формат.

0
ответ дан 17 December 2019 в 04:53
поделиться
#!/bin/ksh
# GNU date is a veritable Swiss Army Knife...
((D=$(date +%w)+2))
if [ $D -gt 3 ]; then D=1; fi
PREV_DT=$(date -d "-$D days" +%F)
3
ответ дан 17 December 2019 в 04:53
поделиться

This should work for Solaris and Linux. It's realy complicating on Unix that you can not use the same commandline arguments on all Unix derivates.

On Linux you can use date -d '-d24 hour ago' to get the last day on Solaris its TZ=CET+24 date. I guess other UNIX'es works the same way as Solaris does.

#!/usr/bin/ksh

lbd=5               # last business day (1=Mon, 2=Thu ... 6=Sat, 7=Sun)
lbd_date=""         # last business day date

function lbdSunOS
{
    typeset back=$1
    typeset tz=`date '+%Z'`     # timezone

    lbd_date=`TZ=${tz}+$back date '+%Y%m%d'`
}

function lbdLinux
{
    typeset back=$1

    lbd_date=`date -d "-d$back hour ago"`
}

function calcHoursBack
{
    typeset lbd=$1
    typeset dow=`date '+%u'`    # day of the week

    if [ $dow -ge $lbd ]
    then
        return $(((dow-lbd)*24))
    else
        return $(((dow-lbd+7)*24))
    fi
}

# Main

calcHoursBack $lbd
lbd`uname -s` $?

echo $lbd_date
0
ответ дан 17 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

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