Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 19
1

Китайский календарь

02.11.2015, 10:40. Показов 3550. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Массив Чисел значений даты OLE-автоматизации:
int[] data = new int[] { 10959, , , , , , , 42308... };

Известно, что промежуток от 10959 и до 11335 соответствует
промежутку обычного календаря от 01.01.1930 и до 12.01.1931,
что соответствует году лошади по Китайскому календарю.
Следующий за ним год козы лежит в промежутке:
от 11336 и до 11688 и соответствует
датам от 13.01.1931 и до 31.12.1931 обычного календаря
и так далее...

Из за того, что календарные промежутки разные решение возможно
с помощью преобразования числового значения в эквивалентное ему
значение даты OLE-автоматизации.

Необходимо из предлагаемой пользователем даты в Label1.Text
(пусть это будет 09. 05. 1945),
определить какому году Китайского календаря она соответствует
и вывести в Label2.Text.

Попытки найти способ перевести дату в OLE-автоматизации ни к чему не привели,
Все найденное предлагает перевести Текущую дату в OLE,
а чтобы определить промежутки, нужно Определённые даты перевести в OLE.

Надеюсь на Вашу помощь как в малом, так и в великом.

Добавлено через 23 часа 31 минуту
Поставим вопрос иначе.
строка:
Label_1 = DateTime.Now.ToOADate();
возвращает эквивалент Текущей даты: 42310

как мне найти эквивалент даты 09.05.1945
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.11.2015, 10:40
Ответы с готовыми решениями:

Отладка кода. Отладчик выдаёт китайский язык
Привет гуру форума. Помогите с отладкой кода. Не пойму почему отладчик говорит что у меня...

календарь
помогите с открытым календарем.. пожалуйста(

Класс Календарь
Пишу тут небольшую программку, но столкнулся с одной проблемой. using System; using...

DataGridView и календарь
Как в один из столбцов DataGridView вставить раскрывающийся календарь?Может с помощью...

7
Эксперт .NET
5871 / 4748 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
03.11.2015, 14:47 2
Цитата Сообщение от Semen_Semenych Посмотреть сообщение
как мне найти эквивалент даты 09.05.1945
C#
1
2
DateTime dt = new DateTime(1945, 5, 9);
string dateToOA = ((int)dt.ToOADate()).ToString();
1
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 19
03.11.2015, 15:58  [ТС] 3
Спасибо за помощь!
А не подскажете может ли "DateTime dt " принимать значения числовых переменных.
Где-то так: "DateTime dt = числовая переменная",
если да, можно пример синтаксиса?

Добавлено через 30 минут
Всё спасибо, сам разобрался.

DateTime dt = new DateTime(x, y, z);
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
03.11.2015, 17:42 4
Цитата Сообщение от Semen_Semenych Посмотреть сообщение
Необходимо из предлагаемой пользователем даты в Label1.Text
(пусть это будет 09. 05. 1945),
определить какому году Китайского календаря она соответствует
и вывести в Label2.Text.
Попробуй вот так:
C#
1
2
3
4
5
using System.Globalization;
//...
DateTime date = new DateTime(1945, 5, 9);
ChineseLunisolarCalendar chnCalendar = new ChineseLunisolarCalendar();
int chineseYear = chnCalendar.GetYear(date);
0
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 19
04.11.2015, 14:52  [ТС] 5
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Попробуй вот так:
Попробовал, не подошло.
Попробовал:
C#
1
int chineseYear = chnCalendar.GetSexagenaryYear(date);
получил привязку в шестидесятилетнем периоде, соответствующий указанной дате,
уже лучше, но по умолчанию в этом представлении год почему то начинается с 1 января,
хотя в реальности есть смещение.

если скорректировать смещение , всё вместе получается длиннее чем, вариант Дацента.
В любом случае спасибо, благодаря Вам узнал, что в С# есть куча других календарей и команд к ним.
Миниатюры
Китайский календарь  
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
04.11.2015, 16:10 6
Semen_Semenych, не понял что тебя не устраивает. В классе ChineseLunisolarCalendar есть методы для определения года из двенадцитилетнего цикла. Сначала нужно вызвать GetSexagenaryYear который вернет год от 1 до 60. Затем передать это значение в метод GetTerrestrialBranch который вернет значение от 1 до 12. Год при этом начинается не 1 января. Для проверки я написал код в LINQPad и получил результат похожий на твою таблицу. Только вот даты начала годов другие. Возможно это таблица для другого азиатского календаря.
Китайский календарь

Код для проверки
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
void Main()
{
    string[] years = new[]{"", "Крыса","Бык","Тигр","Кот","Дракон", "Змея", "Лошадь", "Коза", "Обезьяна","Петух","Собака","Кабан"};
    var chnCalendar = new ChineseLunisolarCalendar();
    List<ChineseZodiac> info = new List<ChineseZodiac>();
    DateTime date = new DateTime(1929, 1, 1);
    for (int i=0; i<120; i++)
    {
        date = chnCalendar.FindFirstNewYearDate(date);
        var zodiac = new ChineseZodiac();
        zodiac.BeginDate = date;
        zodiac.Name = years[chnCalendar.GetTerrestrialBranch(chnCalendar.GetSexagenaryYear(date))];
        date = chnCalendar.FindFirstNewYearDate(date).AddDays(-1);
        zodiac.EndDate = date;
        info.Add(zodiac);
    }
    info.GroupBy(z => z.Name).Select(g => new { g.Key, Years = string.Join(", ", g.Select(zz => zz.BeginDate.Year)) }).Dump();
}
 
class ChineseZodiac
{
    public string Name;
    public DateTime BeginDate;
    public DateTime EndDate;
}
 
static class Ext
{
    public static DateTime FindFirstNewYearDate(this EastAsianLunisolarCalendar calendar, DateTime d)
    {
        int curYear = calendar.GetYear(d);
        for(;;)
        {
            d = d.AddDays(1);
            if (curYear != calendar.GetYear(d))
            {
                break;
            }
        }
       return d;
    }
}
0
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 19
04.11.2015, 17:58  [ТС] 7
в этой строке:
C#
1
public static DateTime FindFirstNewYearDate(this EastAsianLunisolarCalendar calendar, DateTime d)
Ошибка 1 Метод расширения должен быть определен в статическом классе верхнего уровня; Ext является вложенным классом
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
04.11.2015, 18:27 8
Semen_Semenych, в ошибке всё сказано. Метод FindFirstNewYearDate является расширяющим методом (extension method). Такие методы объявляются в отдельном классе. В моем примере FindFirstNewYearDate объявлен внутри класса Ext. Если ты хочешь им пользоваться, то добавь в проект новый класс с именем Ext и замени его объявление на текст из примера.
0
04.11.2015, 18:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2015, 18:27
Помогаю со студенческими работами здесь

Интерактивный календарь
Нужно написать программу, которая выводит интерактивный календарь, который позволяет просматривать...

Календарь для органайзера
Подскажите как создать календарь для простенького оргонайзера на C#

Не запускается программа-календарь
Нашел в интернете нестандартный календарь на С# при запуске пишет...

Как добавить в DataGridView календарь
Здравствуйте!!! нужно в DataGridView добавить возможность выбора даты по календарю (как через...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru