Android Studio: как получить текущую дату и время (Kotlin)
Чтобы в Android Studio получить текущую дату и время (Kotlin), достаточно одной строки кода:
val myDate: Date = Calendar.getInstance().time
Чтобы в Android Studio получить текущую дату и время (Kotlin), достаточно одной строки кода:
val myDate: Date = Calendar.getInstance().time
Новая строка в PHPExcel обозначается символом “\r”.
Плюс должна быть включена опция setWrapText(true):
$objPHPExcel->getDefaultStyle()->getAlignment()->setWrapText(true);
Если вам нужно сделать так, чтобы пользователь не мог в 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()
}
Современный простой способ - использовать для этих целей функцию structuredClone()
Пример:
var a = { name: "test", value: 2 };
var b = structuredClone(a);
console.log(b); // результат: {name: 'test', value: 2}
Если вы встретились с ошибкой "Type of the parameter must be a class annotated with @Entity or a collection/array of it"
Решение:
Обновите версию room минимум до "2.4.3" в файле build.gradle
Если вы встретили ошибку “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
Все просто:
$myDate = new DateTime($mysqlDate);
var_dump($myDate->->format('d.m.Y')); // смотрим на результат
Кратко:
Чтобы сравнить 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);
}
Копирование объекта происходит также как и обычно, только вместо функции replicate
$newModel = $oldModel->replicate();
Нужно использовать
$newModel = $oldModel->replicateWithTranslations();
Для того, чтобы скопировать объект в 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"