Если вам нужно сделать так, чтобы пользователь не мог в Datepicker  выбрать дату, которая еще не наступила, то есть 2 простых способа это сделать. 

При инициализации Datepicker необходимо добавить параметр maxDate со значением 0 или текущей даты new Date()

Примеры: 

 $(function() {
$( "#mydate" ).datepicker({ maxDate: new Date() });
});

Альтернатива: 

$(function() {
$( "#mydate" ).datepicker({ maxDate: 0 });
});

Ошибка "java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time" встречается потому, что если делать запросы в базу в основном потоке, можно “повесить” основной интерфейс.

Запросы в базу лучше делать асинхронно, к примеру используя lifecycleScope. 

В build.gradle добавить androidx.lifecycle:lifecycle-runtime:

implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.5.1"

В классе, где нужно делать запросы в базу, обернуть запрос  в “lifecycleScope.launch(Dispatchers.IO) {}”:

lifecycleScope.launch(Dispatchers.IO) {
// запросы в базу, к примеру:
myclassDao.getAll()
}

  1. Запустите приложение на телефоне (версия API - 26 или выше)
  2. В Android Studio в меню выберите View > Tool Windows > App Inspection
  3. Внизу появился App Inspector. Активируйте там вкладку Database Inspector
  4. Выберите устройство и приложение

Если вы встретили ошибку “Not sure how to handle query method's return type (java.lang.Object). DELETE query methods must either return void or int” при описании запросов Room (Android Studio - kotlin), то скорее всего у delete запроса вы не уточнили возвращаемый тип.

Не правильно: 

@Delete
suspend fun delete(car: Car)

Решение - указать тип Int: 

@Delete
suspend fun delete(car: Car): Int

Если в Android Studio при попытке подключить room в build.gradle вы столкнулись с ошибкой  "A problem occurred evaluating project ':app'. > Could not find method kapt() for arguments", это достаточно просто решить. 

В этом же файле найдите раздел кода с плагинами (plugins) и добавьте туда строку “id 'kotlin-kapt'

An example: 

plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'kotlin-kapt'
}

Чтобы проверить, пересекаются ли два интервала между собой, можно воспользоваться данной функцией:

 function dateIntervalsOverlay(DateTime $firstStart, DateTime $firstEnd, DateTime $secondStart, DateTime $secondEnd): bool
{
$return = false;
if (($firstStart<= $secondEnd) and ($firstEnd>= $secondStart)) {
$return = true;
}
return $return;
}

Пример использования:

$d1s =  new DateTime('2022-09-01');
$d1e = new DateTime('2022-09-24');
$d2s = new DateTime('2022-09-22');
$d2e = new DateTime('2022-09-28');

$test = dateIntervalsOverlay($d1s, $d1e,$d2s, $d2e);
var_dump($test); // true

Другой пример:

$d1s =  new DateTime('2022-09-01');
$d1e = new DateTime('2022-09-15');
$d2s = new DateTime('2022-09-22');
$d2e = new DateTime('2022-09-28');

$test = dateIntervalsOverlay($d1s, $d1e,$d2s, $d2e);
var_dump($test); // false

Кратко: 

  • А - годен к военной службе, здоров.
  • Б - годен к военной службе с незначительными ограничениями.
  • В - ограниченно годен к военной службе. Освобождается от призыва в мирное время и не участвует в военных сборах.
  • Г - временно не годен к военной службе, отсрочка от службы из-за временных проблем со здоровьем или обучения в ВУЗе. 
  • Д - не годен к военной службе.

Чтобы сравнить 2 даты в PHP с использованием DateTime, достаточно просто использовать обычные математические операторы больше / меньше / равно (>, <, ==)

Пример: 

$date1 = new DateTime('2022-09-26 16:12:20');
$date2 = new DateTime('2022-01-11 10:13:30');
var_dump($date1 == $date2); //false
var_dump($date1 > $date2); // true
var_dump($date1 < $date2); // false

Проблема появляется, когда в элемент типа EditText пытаетесь записать обычную строку вместо Editable  

Пример ошибочного использования: 

 binding.myEdit.text = "12345"

Решение - записывать текст не напрямую, а используя метод setText

 binding.myEdit.setText("12345")

Если не использовать View Binding то пример будет выглядеть примерно так: 

val txt = findViewById (R.id.my_text) as EditText
txt.text = "12345" // ошибка
txt.setText("12345") //правильно

Если вы с толкнулись с такой ошибкой - все просто. Вы скопировали напрямую из урока название “ResultProfileBinding”, а вместо этого необходимо было преобразовать название вашего layout, которую используете. 

Пример: 

При использовании стандартного layout activity_main.xml вместо ResultProfileBinding нужно писать ActivityMainBinding (берутся все слова из заголовка layout  с большой буквы и без пробелов + в конце добавляется Binding).

Пример (Kotlin): 

class MainActivity : AppCompatActivity() {

private lateinit var binding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
}


}

Чтобы включить View Binding в Android Studio, необходимо открыть файл build.gradle (module) - в разделе Gradle Scripts.

 В сгенерированном коде необходимо в блок android добавить следующий код: 

android {
buildFeatures {
viewBinding = true
}
}

Затем можно нажать на ссылку в правом верхнем углу Sync Now (или запустить проект). 

...

$newModel = $oldModel->replicate();
$newModel ->push(); // сохраняем в базу чтобы получить ID у модели

// чистим загруженные связи, чтобы далее вручную выбрать, какие именно хотим скопировать
$oldModel->relations = [];

// загружаем только те связи, которые хотите копировать
$oldModel->load('categories', 'parameters' );

foreach ($oldModel->getRelations() as $relationName => $values){
$newModel ->{$relationName}()->saveMany($values);
// saveMany подходит только для связи типа belongsToMany
}

 

Как альтернативную функцию, которая пересохраняет все типы связей можно попробовать такой вариант (но не на всех версиях Laravel срабатывает):

foreach ($oldModel->relations as $relationName => $values){
$newModel ->{$relationName}()->sync($values);
}

Для того, чтобы скопировать объект в Laravel, достаточно всего пары строк кода: 

$newModel = $oldModel->replicate();
$newModel ->push(); // сохраняем в базу

Возможно вам еще нужно будет отдельно сохранить все связи объекта, но это уже отдельная тема для разговора. 

Если необходимо с помощью JavaScript удалить текст, который в скобках, поможет это регулярное выражение:

textVar.replace(/ *\([^)]*\) */g, "");

Пример:

var myString = "This is test text (remove text)";
myString.replace(/ *\([^)]*\) */g, "");

Результат: 

"This is test text"