<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های علی</title>
        <link>https://virgool.io/feed/@alihosseini4976</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-16 18:19:40</pubDate>
        <image>
            <url>https://static.virgool.io/images/default-avatar.jpg</url>
            <title>علی</title>
            <link>https://virgool.io/@alihosseini4976</link>
        </image>

                    <item>
                <title>تبدیل تاریخ با استفاده از Time4j در جاوا</title>
                <link>https://virgool.io/@alihosseini4976/%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-time4j-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-p2xdf8727csj</link>
                <description>سلامتویه این مطلب می خواسم که با همدیگه نحوه کار با کتابخانه Time4j رو بررسی کنیم.من چندین کتابخونه رو استفاده کردم... ولی بنظرم راحتترین اونها کتابخانه Time4j در جاوا هستش.کتابخانه های قدیمی و حتی جدیدی هم هستند که شاید کار با اونها راحت باشه... ولی بنظرم این کتابخونه از همه بهتر هستش...برای مثال کتابخونه  icu4j که برای ibm هستش... کتابخانه قدرتمندی هستش... ولی من دایکیومنت خاصی ازش در مورد تاریخ فارسی ندیدم.و اینکه خیلی هم سنگین هستش و برنامه رو واقعا از نظر حجمی سنگین می کنه.. اونم بخاطر یک تبدیل تاریخ ساده.خوب حالا بهتره که زیاد به هواشی نپردازیم و بریم سر اصل مطلب.اصل مطلب یعنی کتابخانه Time4j ...من چند مدل کد و مثال رو قرار میدم و خودتون بعدا می تونید اونها رو اجرا کنید و ازش استفاده کنید.ولی قبل از قرارداد کد باید بهتون بگم که من از ورژن 5.9.1 استفاده کردم.&lt;dependency&gt;
			&lt;groupId&gt;net.time4j&lt;/groupId&gt;
			&lt;artifactId&gt;time4j-base&lt;/artifactId&gt;
			&lt;version&gt;5.9.1&lt;/version&gt;
		&lt;/dependency&gt;و حالا یک مثالی که خودم ازش استفاده کردم و کدهای خودم رو نوشتم.. شما هم می تونید ازش استفاده کنید:import java.text.ParseException;
import java.time.format.FormatStyle;
import java.util.Locale;

import net.time4j.Moment;
import net.time4j.PlainDate;
import net.time4j.SystemClock;
import net.time4j.TemporalType;
import net.time4j.calendar.PersianAlgorithm;
import net.time4j.calendar.PersianCalendar;
import net.time4j.engine.CalendarDate;
import net.time4j.format.expert.ChronoFormatter;
import net.time4j.format.expert.PatternType;
import net.time4j.tz.olson.ASIA;

public class DateUtil {

    public static void main(String[] args) throws ParseException {
        PersianCalendar pcal = PersianCalendar.of(1401, 07, 30); // = 2025-03-20 (gregorian)
        ChronoFormatter&lt;PersianCalendar&gt; f = ChronoFormatter
                .ofPattern(&amp;quotyyyy/MM/dd&amp;quot, PatternType.CLDR, Locale.ROOT, PersianCalendar.axis())
                .with(PersianAlgorithm.attribute(), PersianAlgorithm.BIRASHK);
        System.out.println(f.format(pcal));
        ///////////////////////////////////////////////

        // conversion from jalali to gregorian by constructed input
        PersianCalendar jalali = PersianCalendar.of(1394, 11, 5);
        // or use a safe enum instead of the month number:
        // PersianCalendar jalali = PersianCalendar.of(1394, PersianMonth.BAHMAN, 5);

        PlainDate gregorian = jalali.transform(PlainDate.class);
        System.out.println(gregorian); // 2016-01-25

        // conversion to millis-since-unix (timezone-dependent)
        Moment moment1 = gregorian.atStartOfDay().inTimezone(ASIA.TEHRAN);
        long millisSinceUnix = TemporalType.MILLIS_SINCE_UNIX.from(moment1);
        System.out.println(millisSinceUnix); // 1453667400000L

        // conversion of millis-since-unix to jalali (timezone-dependent)
        Moment moment2 = TemporalType.MILLIS_SINCE_UNIX.translate(millisSinceUnix);
        PlainDate gregorian2 = moment2.toZonalTimestamp(ASIA.TEHRAN).toDate();
        System.out.println(gregorian2.transform(PersianCalendar.class)); // AP-1394-11-05

        // formatting and parsing in Farsi language using full style
        ChronoFormatter&lt;PersianCalendar&gt; f1 = ChronoFormatter.ofStyle(FormatStyle.FULL, new Locale(&amp;quotfa&amp;quot),
                PersianCalendar.axis());
        System.out.println(f1.format(jalali)); // ه‍.ش. ۱۳۹۴ بهمن ۵, دوشنبه

        // formatting in English language using custom pattern
        ChronoFormatter&lt;PersianCalendar&gt; f2 = ChronoFormatter.ofPattern(&amp;quotyyyy/MM/dd&amp;quot, PatternType.CLDR, Locale.ENGLISH,
                PersianCalendar.axis());
        System.out.println(f2.format(jalali)); // 5. Bahman 1394

        ChronoFormatter&lt;PersianCalendar&gt; formatter = ChronoFormatter.setUp(PersianCalendar.axis(), new Locale(&amp;quotfa&amp;quot))
                .addPattern(&amp;quotEEE, d. MMMM yyyy&amp;quot, PatternType.CLDR_DATE).build();
        PlainDate today = SystemClock.inLocalView().today();
        PersianCalendar jalali2 = today.transform(PersianCalendar.class);
        System.out.println(formatter.format(jalali2));

        ////////////////////////////////////////////////////////////////////////
        Locale loc = Locale.forLanguageTag(&amp;quotde-IR-u-ca-persian&amp;quot);
        ChronoFormatter&lt;CalendarDate&gt; formatter3 = ChronoFormatter.ofGenericCalendarStyle(FormatStyle.MEDIUM, loc);
        PersianCalendar jalali3 = PersianCalendar.of(1393, 1, 10);
        PlainDate gregorian3 = jalali3.transform(PlainDate.class);
        System.out.println(formatter3.format(jalali3));
        System.out.println(formatter3.format(gregorian3));
    }

}این یک مدل ساده هستش که وقتی اجراش کنید می تونید از ساختارش برای کدهای خودتون استفاده کنید و خروجی زیر رو هم بهتون میده:1401/07/30
2016-01-25
1453667400000
AP-1394-11-05
۱۳۹۴ بهمن ۵, دوشنبه
1394/11/05
چهارشنبه, ۱۲. بهمن ۱۴۰۱
10.01.1393 AP
10.01.1393 APحالای مثالی که خودم هم برای بخشی از پروژه خودم ازش استفاده کردم هم در زیر اومده:import net.time4j.Moment;
import net.time4j.PlainDate;
import net.time4j.SystemClock;
import net.time4j.TemporalType;
import net.time4j.calendar.PersianCalendar;
import net.time4j.format.expert.ChronoFormatter;
import net.time4j.format.expert.PatternType;
import net.time4j.tz.olson.ASIA;

import java.text.ParseException;
import java.util.Date;
import java.util.Locale;

public class Time4jTest {

    public static void main(String[] args) throws ParseException {
        System.out.println(getCurrentDateJalali());
        System.out.println(getInputJalaliDateToJalali());
        System.out.println(getCurrentTimeStamp(new Date()));
    }

    private static String getCurrentDateJalali() {
        ChronoFormatter&lt;PersianCalendar&gt; formatter =
                ChronoFormatter.setUp(PersianCalendar.axis(), new Locale(&amp;quotfa&amp;quot))
                        .addPattern(&amp;quotEEE, d. MMMM yyyy&amp;quot, PatternType.CLDR_DATE).build();
        PlainDate today = SystemClock.inLocalView().today();
        PersianCalendar jalali = today.transform(PersianCalendar.class);
        return formatter.format(jalali);
    }

    public static String getInputJalaliDateToJalali() {
        // conversion from jalali to gregorian by constructed input
        PlainDate today = SystemClock.inLocalView().today();
        PersianCalendar jalali = today.transform(PersianCalendar.class);

        // formatting in English language using custom pattern
        ChronoFormatter&lt;PersianCalendar&gt; f2 =
                ChronoFormatter.ofPattern(
                        &amp;quotEEE, d. MMMM yyyy&amp;quot, PatternType.CLDR, Locale.ENGLISH, PersianCalendar.axis());
        return f2.format(jalali);
    }

    public static String getCurrentTimeStamp(Date input) {
        ChronoFormatter&lt;PersianCalendar&gt; formatter =
                ChronoFormatter.setUp(PersianCalendar.axis(), new Locale(&amp;quotfa&amp;quot))
                        .addPattern(&amp;quotEEE, d. MMMM yyyy&amp;quot, PatternType.CLDR_DATE).build();

        Moment m2 = TemporalType.JAVA_UTIL_DATE.translate(input);
        PersianCalendar jalali = m2.toZonalTimestamp(ASIA.TEHRAN).toDate().transform(PersianCalendar.class);
        return formatter.format(jalali);
    }
}این هم خروجی دستور بالا:چهارشنبه, ۱۲. بهمن ۱۴۰۱
Wed, 12. Bahman 1401
چهارشنبه, ۱۲. بهمن ۱۴۰۱در توضیح کد دوم باید بگم که تابع getCurrentDateJalali تاریخ شمسی جاری رو به صورت پارسی چاپ می کنه و تابع getInputJalaliDateToJalali هم تاریخ شمسی جاری رو به صورت انگلیسی نمایش میده.. و تابع getCurrentTimeStamp هم کار تاربع اول رو با استفاده از تاریخ ورودی انجام میده.امیدوارم که برای شما عزیزام مفید بوده باشه...مراقب خوبی هاتون باشیدخدانگهدار</description>
                <category>علی</category>
                <author>علی</author>
                <pubDate>Sat, 04 Feb 2023 14:23:36 +0330</pubDate>
            </item>
                    <item>
                <title>ایجاد خروجی فایلی در جاوا</title>
                <link>https://virgool.io/@alihosseini4976/%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D8%AE%D8%B1%D9%88%D8%AC%DB%8C-%D9%81%D8%A7%DB%8C%D9%84%DB%8C-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-islgc8yd01vg</link>
                <description>سلام و وقتاین اولین پست من تویه وبلاگ هستش و سعی می کنم براتون آموزش ها و چیزهایی که خودم استفاده کردم و حس می کنم که به درد شما هم می خوره را قرار میدم.امیدوار که مفید باشه.در اولین پست می خوام نحوه خروجی گرفتن از یک لیست تو در تو یا به اصطلاح nested model‌ را قرار بدم.البته برای اینکه بتونید خروجی رو به صورت کامل ببینید می تونید سروس کد رو از لینک ببینید.اگه هم خواستید با لایسنس کاملا آزاد منتشر کنید.مسیر تست هم در شاخه com.test و کلاس TestReportCreatorTest هستش و با اجرای اون 2 تا فایل ایجاد میشه که شامل خروجی های CSV و ELSX میشه.خروجی های دیگه رو می تونید به دلخواه خودتون و با تغییر در خروجی از برنامه بگیرید.مدل ورودی ما به اسم ColumnModelDetails هستش که در واقع یک لیست از کلاس ColumnModelDetails هستش و شامل تیتر و متغییر و مسیر اون میشه و اینکه نوع متغییر از انواع ساده هستش یا اینکه یک لیست یا زیر مجموعه های دیگه ای از کلاس هستش..  و اینکه آیا می خواید ستونها قابلیت مرج شدن و سورت شدن داشته باشند یا خیر. یک فیلد ایندکس هم داره که به صورت پیش فرض مقدار -1 باید وارد بشه و کاربر نباید واردش کنه، چون برنامه به خطا می خوره.و نمونه تکمیل شده هم در خود پروژه وجود داره.حالا بخوام توضیحات کلی پروژه رو بدم به چند دسته تقسیم می کنم.۱- دریافت لیست داده ها، مدل و نحوه خروجی که با لیستی از کلاس ColumnModelDetails قابل مشاهده هستش. (در خط 24 از کلاس تست)۲- دریافت خروجی اکسل که در به دو قسمت تبدیل میشه. قسمت اول خروجی اکسل و قسمت دوم خروجی CSV که نحوه دریافت این خروجی ها در خطوط 31 و 49 قابل مشاهده هستش.خوب توضیح خاصی باقی نمی مونه ولی چندتا نکته وجود داره:نکته 1: خروجی برنامه قبل از تبدیل به فایل به صورت لیستی از رشته ها هستش که از طریق متغییر columnsExport در کلاس com.emreh.creator.CreateSimpleReport قابل مشاهده هستش.نکته 2: برنامه برای تبدیل مدل ورودی به خروجی (لیستی از رشته ها) از جاوا رفلکشن یا Java Reflection‌ استفاده می کنه.نکته 3: برای به فایل هم از برنامه Apache POI استفاده میشه.خوب اگه مشکلی بود هم می تونید بگید یا اگه ویژگی خاصی مد نظرتون بود که بنظرتون خوبه که تویه برنامه بذارم هم بگید تا بذارمش.ممنون از توجهتون و اینکه اگه پیشنهاد یا انتقادی دارید بگید.باتشکر از همه شماها</description>
                <category>علی</category>
                <author>علی</author>
                <pubDate>Sat, 04 Feb 2023 14:18:30 +0330</pubDate>
            </item>
            </channel>
</rss>