Merci! C'est Yosuke. Je n'arrive pas à penser à un bon titre w C'est difficile d'avoir un titre concis, concret et sympa (rires). Je pense que c'est un peu différent des blogs, et comme moi et le contenu, je ferai de mon mieux pour que ça soit bien!
Partie 1 expliquait les dates des fêtes nationales. Dans la deuxième partie, je présenterai la façon de penser lors de l'assemblage du code source (bien que je montre que je pensais de cette façon ...), le code source, et quelques inconvénients, donc je les présenterai également. Je vais. En tant que revue de la première partie, je republierai les jours de vacances et les remarques.
Nom de vacances | Date | Remarques |
---|---|---|
Nouveau jour | 1er janvier | - |
Journée adulte | Deuxième lundi de janvier | - |
jour fondation | 11 février | - |
Anniversaire de l'empereur | 23 février | - |
Journée de l'équinoxe vernal | Un du 19 au 22 mars | Déterminez la date par le reste de la division de l'année par 4 |
Showa Day | 29 avril | - |
Anniversaire constitutionnel | 3 mai | - |
Jour vert | 4 mai | - |
La journée des enfants | 5 mai | - |
Journée de la mer | Troisième lundi de juillet | 23 juillet 2020 |
Journée de montagne | 11 août | 10 août 2020 |
Journée Keiro | Troisième lundi de septembre | - |
Jour d'automne | 1 de 22-24 jours en septembre | Déterminez la date par le reste de la division de l'année par 4 |
Journée sportive | Deuxième lundi d'octobre | 24 juillet 2020 |
Journée de la culture | 3 novembre | - |
Action de grâce du travail | 23 novembre | - |
--En pensant
Avant d'écrire le code source, je vais vous expliquer mes pensées. Le premier à utiliser est la ** classe Calendar **. En faisant cela, vous pouvez obtenir l'année, le mois, le jour, le jour et la semaine et régler les vacances en conséquence ... C'est naturel (rires). J'utilise la base de données parce que je veux afficher les jours fériés soulignés dans TextView et appuyer pour afficher les détails dans une boîte de dialogue.
id | name | detail | adress |
---|---|---|---|
1 | Nouveau jour | Un ans... | https.... |
2 | Journée adulte | À la loi sur les vacances... | https... |
... | ... | ... | ... |
15 | Journée de la culture | De l'empereur Meiji... | https... |
16 | Action de grâce du travail | À l'ère Reiwa... | https.... |
Je l'ai omis au milieu, mais attribuez un identifiant à chaque jour férié et affichez le jour férié et ses détails en fonction de cet identifiant ... Hmm ↑ Comprends-tu comme ça ... Désolé pour la mauvaise explication m (..) m Vient ensuite les vacances de transfert, mais c'est aussi une base de données avec uniquement un identifiant et un indicateur
id | flag |
---|---|
100 | 0 |
Si un jour férié arrive le dimanche, définissez l'indicateur sur 1 et remettez-le à 0 si ce jour est un jour férié de transfert. Je fais quelque chose comme ça. C'est pourquoi il y a des inconvénients ...
Le code source est divisé en Holiday.java, qui détermine les jours fériés, DateDatabeseHelper.java dans la base de données et MainActivity.java, qui est le principal.
Holiday.java
public class Holiday {
//Obtenez la date, le jour, l'année, la semaine du jour
int year,month,day,youbi,week;
Calendar calendar = Calendar.getInstance();
//Base de données
DateDatabaseHelper helper = null;
//Déterminer si afficher les jours fériés nationaux
boolean holidayFlag;
//Obtenez le nom, les détails et l'identifiant des vacances
String holidayName,holidayDetail;
int id;
//Vacances de transfert de juge
boolean transHolidayFlag;
public void holiday(){
year = calendar.get(Calendar.YEAR); //Année
month = calendar.get(Calendar.MONTH) + 1; //Mois
day = calendar.get(Calendar.DAY_OF_MONTH); //journée
youbi = calendar.get(Calendar.DAY_OF_WEEK); //journée
week = calendar.get(Calendar.WEEK_OF_MONTH); //la semaine
if(month == 1 && day == 1){
//Nouveau jour
id = 1;
holidayFlag = true;
}
else if(month == 1 && week == 2 && youbi == 2){
//Journée adulte
id = 2;
holidayFlag = true;
}
else if(month == 2 && day == 11){
//jour fondation
id = 3;
holidayFlag = true;
}
else if(month == 2 && day == 23){
//Anniversaire de l'empereur
id = 4;
holidayFlag = true;
}
else if(month == 3){
//Journée de l'équinoxe vernal
switch (year % 4){
case 0:
//1992-20 jours jusqu'en 2091
if(year >= 1992 && year <= 2091){
if(day == 20){
id = 5;
holidayFlag = true;
}
else {
holidayFlag = false;
}
}
//2092-19 jours jusqu'en 2099
else{
if(day == 19){
id = 5;
holidayFlag = true;
}
else {
holidayFlag = false;
}
}
break;
case 1:
//1992-20 jours jusqu'en 2099
if(day == 20){
id = 5;
holidayFlag = true;
}
else {
holidayFlag = false;
}
break;
case 2:
//1992-21 jours jusqu'en 2023
if(year >= 1992 && year <= 2023){
if(day == 21){
id = 5;
holidayFlag = true;
}
else{
holidayFlag = false;
}
}
//2024-20 jours jusqu'en 2099
else{
if(day == 20){
id = 5;
holidayFlag = true;
}
else{
holidayFlag = false;
}
}
break;
case 3:
//1992-21 jours jusqu'en 2055
if(year >= 1992 && year <= 2055){
if(day == 21){
id = 5;
holidayFlag = true;
}
else{
holidayFlag = false;
}
}
//2056-20 jours jusqu'en 2099
else{
if(day == 20){
id = 5;
holidayFlag = true;
}
else{
holidayFlag = false;
}
}
break;
}
}
else if(month == 4 && day == 29){
//Showa Day
id = 6;
holidayFlag = true;
}
else if(month == 5 && day == 3){
//Anniversaire constitutionnel
id = 7;
holidayFlag = true;
}
else if(month == 5 && day == 4){
//Jour vert
id = 8;
holidayFlag = true;
}
else if(month == 5 && day == 5){
//La journée des enfants
id = 9;
holidayFlag = true;
}
else if(year != 2020 && month == 7 && week == 3 && youbi == 2){
//Journée de la mer
id = 10;
holidayFlag = true;
}
else if(year == 2020 && month == 7 && day == 23){
//Le jour de la mer ne bouge qu'en 2020
id = 10;
holidayFlag = true;
}
else if(year != 2020 && month == 8 && day == 11){
//Journée de montagne
id = 11;
holidayFlag = true;
}
else if(year == 2020 && month == 8 && day == 10){
//Les jours de montagne ne bougent qu'en 2020
id = 11;
holidayFlag = true;
}
else if(month == 9 && week == 3 && youbi == 2){
//Journée Keiro
id = 12;
holidayFlag = true;
}
else if(month == 9){
//Jour d'automne
switch (year % 4){
case 0:
//2012-22 jours jusqu'en 2099
if(day == 22){
id = 13;
holidayFlag = true;
}
else {
holidayFlag = false;
}
break;
case 1:
//2012-23 jours jusqu'en 2043
if(year >= 2012 && year <= 2043){
if(day == 23){
id = 13;
holidayFlag = true;
}
else{
holidayFlag = false;
}
}
//2044-22 jours jusqu'en 2099
else{
if(day == 22){
id = 13;
holidayFlag = true;
}
else{
holidayFlag = false;
}
}
break;
case 2:
//2012-23 jours jusqu'en 2075
if(year >= 2012 && year <= 2075){
if(day == 23){
id = 13;
holidayFlag = true;
}
else{
holidayFlag = false;
}
}
//2076-22 jours jusqu'en 2099
else{
if(day == 22){
id = 13;
holidayFlag = true;
}
else{
holidayFlag = false;
}
}
break;
case 3:
//2012-23 jours jusqu'en 2099
if(day == 23){
id = 13;
holidayFlag = true;
}
else{
holidayFlag = false;
}
break;
}
}
else if(year != 2020 && month == 10 && week == 2 && youbi == 2){
//Journée sportive
id = 14;
holidayFlag = true;
}
else if(year == 2020 && month == 7 && day == 24){
//La journée du sport ne bougera qu'en 2020
id = 14;
holidayFlag = true;
}
else if(month == 11 && day == 3){
//Journée de la culture
id = 15;
holidayFlag = true;
}
else if(month == 11 && day == 23){
//Action de grâce du travail
id = 16;
holidayFlag = true;
}
else{
holidayFlag = false;
}
}
//Passer à main que ce soit des vacances ou non
public boolean getHoliday(){
return holidayFlag;
}
//passer l'identifiant au main
public int holiday_info(){
return id;
}
//Passez au main s'il y a des vacances le dimanche
public boolean getTransferHoliday(){
//Si c'est un jour férié et que ce jour est dimanche
if(holidayFlag == true && youbi == 1){
transHolidayFlag = true;
}
else{
transHolidayFlag = false;
}
return transHolidayFlag;
}
}
Bien qu'il soit redondant, il juge essentiellement si le jour est un jour férié et s'il y a un jour férié le dimanche et transmet le résultat du jugement à Main.
DateDatabaseHelper.java
public class DateDatabaseHelper extends SQLiteOpenHelper {
static final private String DBNAME = "OneDayDiary.sqlite";
static final private int VERSION = 16;
public DateDatabaseHelper(Context context) {
super(context, DBNAME, null, VERSION);
}
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
}
@Override
public void onCreate(SQLiteDatabase db) {
----Omission-----
//Base de données de vacances
db.execSQL("CREATE TABLE holiday(" +
"id INTEGER PRIMARY KEY, name TEXT, detail TEXT, adress TEXT)");
int[] id_holiday = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
String[] name_holiday = {
"Nouveau jour","Journée adulte","jour fondation","Anniversaire de l'empereur","Journée de l'équinoxe vernal","Showa Day","Anniversaire constitutionnel","Jour vert","La journée des enfants",
"Journée de la mer","Journée de montagne","Journée Keiro","Jour d'automne","Journée sportive","Journée de la culture","Action de grâce du travail"
};
String[] detail_holiday = {
"C'est un jour férié en début d'année, et la loi sur les vacances vise à «fêter le début de l'année».",
"Selon la loi sur la fête nationale, des cérémonies pour adultes ont lieu dans divers endroits de la journée dans le but de «célébrer un jeune homme qui sait qu'il a grandi et tente de survivre».",
"Il a été établi comme une journée pour célébrer la fondation du pays. La loi sur les vacances stipule: «Nous continuerons à établir le pays et à cultiver un amour pour le pays».",
""Célébrer la naissance de l'empereur" est le but de la loi sur les vacances, et divers événements tels que le Festival de Tencho ont lieu dans des sanctuaires généraux et des sanctuaires shintoïstes à divers endroits.",
"La loi sur les vacances stipule que «loue la nature et prend soin des êtres vivants», et il est dit que la durée du jour et de la nuit est égale.",
"Ce jour, qui est l'anniversaire de l'empereur Showa, a été établi comme "Showa Day". La loi sur les vacances stipule qu '«après les jours de turbulence, nous regardons en arrière sur l'ère Showa, qui a été reconstruite, et pensons à l'avenir du pays».",
"La loi sur les jours fériés stipule que cette journée doit être «pour commémorer l'application de la Constitution du Japon et promouvoir la croissance du pays».",
"L'origine du nom est "Green Day" parce que l'empereur Showa aimait la nature. Il y avait d'autres opinions telles que "Science Day". Selon la loi sur les vacances, le but est de «se rapprocher de la nature, d'apprécier ses bienfaits et de nourrir un cœur riche».",
"Le but de cette journée, qui est une fête de la fin de la journée, est stipulé dans la loi sur les vacances: «Nous apprécions les droits humains des enfants, luttons pour leur bonheur et remercions leurs mères».",
"Selon la loi sur la fête nationale, la Journée de la mer vise à «vous remercier pour les bienfaits de la mer et souhaiter la prospérité du Japon, pays marin».",
"Cette journée a été créée en 2014 et a été nouvellement créée en 2016. Il s'agit de la première nouvelle fête en 20 ans depuis le "Sea Day" en 1996. Le but de la loi sur les vacances est de "donner l'opportunité de connaître la montagne et d'apprécier les bienfaits de la montagne".",
"La loi sur les vacances vise à «respecter les personnes âgées qui vivent dans la société depuis de nombreuses années et célèbrent leur longévité».",
"On dit que la journée est raccourcie et que la durée du jour et de la nuit est la même. Le but de la loi sur les vacances est de «respecter les ancêtres et de pleurer les personnes perdues».",
"À partir de 2020, le nom est passé de «Journée de l'éducation physique» à «Journée du sport». En 2020, il déménagera le 24 juillet. La loi sur les vacances stipule que «la coloration dans le sport et le maintien d'un esprit et d'un corps sains».",
"En ce jour, qui est l'anniversaire de l'empereur Meiji, selon la loi sur les fêtes, le but est «d'aimer la liberté et la paix et de promouvoir la culture».",
"À l'ère Reiwa, ce jour est le dernier jour férié de l'année. Le but de la loi sur les fêtes est de «travailler dur, célébrer la production et se remercier»."
};
String[] url_holiday = {
"https://ja.wikipedia.org/wiki/%E5%85%83%E6%97%A5",
"https://ja.wikipedia.org/wiki/%E6%88%90%E4%BA%BA%E3%81%AE%E6%97%A5",
"https://ja.wikipedia.org/wiki/%E5%BB%BA%E5%9B%BD%E8%A8%98%E5%BF%B5%E3%81%AE%E6%97%A5",
"https://ja.wikipedia.org/wiki/%E5%A4%A9%E7%9A%87%E8%AA%95%E7%94%9F%E6%97%A5",
"https://ja.wikipedia.org/wiki/%E6%98%A5%E5%88%86%E3%81%AE%E6%97%A5",
"https://ja.wikipedia.org/wiki/%E6%98%AD%E5%92%8C%E3%81%AE%E6%97%A5",
"https://ja.wikipedia.org/wiki/%E6%86%B2%E6%B3%95%E8%A8%98%E5%BF%B5%E6%97%A5_(%E6%97%A5%E6%9C%AC)",
"https://ja.wikipedia.org/wiki/%E3%81%BF%E3%81%A9%E3%82%8A%E3%81%AE%E6%97%A5",
"https://ja.wikipedia.org/wiki/%E3%81%93%E3%81%A9%E3%82%82%E3%81%AE%E6%97%A5",
"https://ja.wikipedia.org/wiki/%E6%B5%B7%E3%81%AE%E6%97%A5",
"https://ja.wikipedia.org/wiki/%E5%B1%B1%E3%81%AE%E6%97%A5",
"https://ja.wikipedia.org/wiki/%E6%95%AC%E8%80%81%E3%81%AE%E6%97%A5",
"https://ja.wikipedia.org/wiki/%E7%A7%8B%E5%88%86%E3%81%AE%E6%97%A5",
"https://ja.wikipedia.org/wiki/%E4%BD%93%E8%82%B2%E3%81%AE%E6%97%A5",
"https://ja.wikipedia.org/wiki/%E6%96%87%E5%8C%96%E3%81%AE%E6%97%A5",
"https://ja.wikipedia.org/wiki/%E5%8B%A4%E5%8A%B4%E6%84%9F%E8%AC%9D%E3%81%AE%E6%97%A5"
};
db.beginTransaction();
try{
SQLiteStatement sql_holiday = db.compileStatement(
"INSERT INTO holiday(id, name, detail, adress) VALUES(?,?,?,?)");
for(int i = 0; i < id_holiday.length; i++){
sql_holiday.bindLong(1,id_holiday[i]);
sql_holiday.bindString(2,name_holiday[i]);
sql_holiday.bindString(3,detail_holiday[i]);
sql_holiday.bindString(4,url_holiday[i]);
sql_holiday.executeInsert();
}
db.setTransactionSuccessful();
} catch (SQLException e){
e.printStackTrace();
} finally {
db.endTransaction();
}
db.execSQL("CREATE TABLE transHoliday(" +
"id INTEGER PRIMARY KEY, flag INTEGER)");
db.execSQL("INSERT INTO transHoliday(" +
"id, flag) VALUES(100,0)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int old_v, int new_v) {
db.execSQL("DROP TABLE IF EXISTS holiday");
db.execSQL("DROP TABLE IF EXISTS transHoliday");
onCreate(db);
}
}
Dans la base de données, les données sur les jours fériés et uniquement les vacances de transfert on / off sont préparées à l'avance. En passant, je pense que la raison pour laquelle l'URL est entrée en tant que données peut être utilisée sur un autre écran. L'URL comprend non seulement ce jour férié, mais également des informations sur Fukuoka et l'URL de l'anniversaire du jour.
MainActivity.java
public class MainActivity extends AppCompatActivity{
//Prêt à afficher la date et le jour
private TextView today;
Calendar calendar = Calendar.getInstance();
int year,month,day;
---Omission---
//jours fériés
private TextView holiday;
String holidayName,holidayDetail; //Nom et détails des vacances
boolean holidayFlag,transHolidayFlag; //S'il y a des vacances et des vacances de transfert
int holidayId; //ID pour la recherche dans DB
long transHoliday = 0; //Transfert du drapeau de vacances
Holiday Hday = new Holiday(); //Cours de vacances
---Omission---
//Prêt à se connecter à la base de données
private DateDatabaseHelper helper = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Déclaration de chaque widget
---Omission---
holiday = findViewById(R.id.holiday);
---Omission---
//Obtenez la date du jour
year = calendar.get(calendar.YEAR);
month = calendar.get(calendar.MONTH) + 1;
day = calendar.get(calendar.DAY_OF_MONTH);
---Omission---
//jours fériés
//Exécutez la méthode des vacances
Hday.holiday();
//Déterminer s'il y a un jour férié
holidayFlag = Hday.getHoliday();
//Obtenez la présence ou l'absence de vacances de transfert
transHolidayFlag = Hday.getTransferHoliday();
//Transférer l'identifiant de vacances
String[] transHdayId = {"100"};
//Mettre à jour l'indicateur DB sur 1 si transHolidayFlag est vrai
SQLiteDatabase db_transUp1 = helper.getWritableDatabase();
try{
if(transHolidayFlag == true) {
ContentValues cv_transUp1 = new ContentValues();
cv_transUp1.put("flag",1);
db_transUp1.update("transHoliday",cv_transUp1,"id = ?",transHdayId);
}
Cursor cursor_transUp1 = db_transUp1.rawQuery("select flag from transHoliday",null);
cursor_transUp1.moveToFirst();
transHoliday = cursor_transUp1.getLong(0);
} finally {
db_transUp1.close();
}
if(holidayFlag == true){
//Obtenez le nom et les détails s'il y a des vacances
holidayId = Hday.holiday_info();
SQLiteDatabase db_holiday = helper.getWritableDatabase();
try{
Cursor cursor_holiday = db_holiday.query(
"holiday",
new String[] {"name","detail"},
"id = ?",
new String[] {"" + holidayId},
null,
null,
null
);
cursor_holiday.moveToFirst();
holidayName = cursor_holiday.getString(0);
holidayDetail = cursor_holiday.getString(1);
//Souligner holidayName
SpannableString uHoliday = new SpannableString(holidayName);
uHoliday.setSpan(new UnderlineSpan(),0,holidayName.length(),0);
holiday.setText(uHoliday);
//Rendre les lettres du jour rouges
day_of_the_week.setTextColor(Color.RED);
} finally {
db_holiday.close();
}
}
else if(transHoliday == 1 && holidayFlag == false ){
//Si le drapeau de vacances de transfert est vrai et que le drapeau de vacances nationales est également faux, ce jour est un jour férié de transfert
holiday.setText("Transfert vacances");
holidayDetail = "Aujourd'hui est un jour férié de transfert";
//Remettre l'indicateur de vacances de transfert DB à 0
SQLiteDatabase db_transUp2 = helper.getWritableDatabase();
try{
ContentValues cv_transUp2 = new ContentValues();
cv_transUp2.put("flag",0);
db_transUp2.update("transHoliday",cv_transUp2,"id = ?",transHdayId);
} finally {
db_transUp2.close();
}
}
else{
//Ne pas afficher si ce n'est pas un jour férié
holiday.setText("");
}
//Afficher les détails dans la boîte de dialogue
holiday.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle(holidayName);
builder.setMessage(holidayDetail);
builder.setCancelable(false);
builder.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
builder.create().show();
}
});
---Omission---
//onCreate est ici
}
}
Dans Main, les jours fériés et les vacances de transfert sont jugés en fonction du holidayFlag et transHolidayFlag reçus de Holiday.java, et l'activation / désactivation est désactivée de la base de données pour les vacances et de la base de données pour les vacances de transfert. Puisque .setOnClickListener peut également être utilisé dans TextView, appuyez sur le nom du jour férié affiché pour afficher les détails dans une boîte de dialogue.
Puisque le 23 février 2020 (dimanche) n'est que l'anniversaire de l'empereur, j'ai essayé de jouer avec la date sur mon smartphone. Lorsque vous appuyez sur la lettre rouge "Anniversaire de l'empereur" sur la gauche. Et les détails peuvent être affichés. (La lettre bleue "Anniversaire de l'empereur" à droite doit être un autre anniversaire ...) Et le lundi suivant est un jour férié de transfert, je vais donc l'essayer le 24. Le jour férié de transfert lui-même n'a pas besoin d'être affiché séparément, il n'est donc pas souligné, mais si vous le touchez pour le moment De cette manière, "Aujourd'hui est un congé de transfert" s'affiche.
La définition d'un jour férié de transfert était "s'il y a un jour férié le dimanche, le jour de la semaine suivant est un jour férié de transfert". Nous pouvons juger des jours fériés parce que nous connaissons les chiffres, mais nous avons décidé que les vacances de transfert sont les dimanches et les jours fériés. Le problème ici est
Cela devrait bien fonctionner les jours fériés! Eh bien, c'est redondant (rires). Eh bien, pour le moment, je vous rapporterai à nouveau s'il semble que le congé de transfert peut être résolu en procédant tel quel. gekimuzu ..
** Addendum ** Je publie une version corrigée car le traitement du lundi ○ était incorrect. →https://qiita.com/ysk75/items/278c52bf4052991eb99d
Jours fériés: https://ja.wikipedia.org/wiki/%E5%9B%BD%E6%B0%91%E3%81%AE%E7%A5%9D%E6%97%A5 Obtenez des informations sur la date et l'heure: https://www.javadrive.jp/start/calendar/index2.html
Recommended Posts