এই টিউটোরিয়ালে আমরা শিখব কীভাবে ইন্টারনেট থেকে নেটওয়ার্ক টাইম প্রোটোকল (NTP) বা সার্ভার টাইম ব্যবহার করে সঠিক বর্তমান তারিখ ও সময় পেতে হয়।
গুরুত্বপূর্ণ নোট
প্রদত্ত উদাহরণে আসলে ডিভাইসের লোকাল ক্যালেন্ডার ব্যবহার করা হয়েছে, ইন্টারনেট থেকে নয়। নিচে আসল ইন্টারনেট টাইম পাওয়ার পদ্ধতিগুলো দেওয়া হলো।
প্রয়োজনীয় ধাপগুলো (লোকাল টাইম - মূল উদাহরণ)
ধাপ ১: নতুন প্রজেক্ট তৈরি করুন
Android Studio-তে File → New Project এ যান এবং প্রয়োজনীয় বিবরণ পূরণ করে একটি নতুন প্রজেক্ট তৈরি করুন।
ধাপ ২: লেআউট ফাইল তৈরি করুন
res/layout/activity_main.xml ফাইলে নিচের কোড যোগ করুন:
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="168dp" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView"
android:layout_centerHorizontal="true"
android:layout_marginTop="36dp"
android:text="Click here to get current time and date"
android:textColor="@color/colorPrimary" />
</RelativeLayout>
ধাপ ৩: মেইন এক্টিভিটিতে লোকাল টাইম দেখান
src/MainActivity.java ফাইলে নিচের কোড যোগ করুন:
package app.com.sample;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
Calendar calendar;
SimpleDateFormat simpleDateFormat;
String date;
TextView displayDateTime;
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
displayDateTime = findViewById(R.id.textView);
btn = findViewById(R.id.button);
calendar = Calendar.getInstance();
simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
date = simpleDateFormat.format(calendar.getTime());
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
displayDateTime.setText(date);
}
});
}
}
ধাপ ৪: ম্যানিফেস্ট কনফিগার করুন
AndroidManifest.xml ফাইল:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.com.sample">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
আসল ইন্টারনেট টাইম পাওয়ার পদ্ধতি (NTP)
NTP ক্লায়েন্ট বাস্তবায়ন (Java)
public class NTPClient {
private static final String NTP_SERVER = "pool.ntp.org";
private static final int NTP_PORT = 123;
private static final int NTP_PACKET_SIZE = 48;
private static final long OFFSET_1900_TO_1970 = 2208988800L;
public static long getNTPTime() throws IOException {
DatagramSocket socket = new DatagramSocket();
socket.setSoTimeout(5000);
InetAddress address = InetAddress.getByName(NTP_SERVER);
byte[] buffer = new byte[NTP_PACKET_SIZE];
// NTP রিকোয়েস্ট প্যাকেট তৈরি
buffer[0] = 0x1B; // LI=0, VN=3, Mode=3 (Client)
DatagramPacket request = new DatagramPacket(buffer, buffer.length, address, NTP_PORT);
socket.send(request);
DatagramPacket response = new DatagramPacket(buffer, buffer.length);
socket.receive(response);
socket.close();
// ট্রান্সমিট টাইমস্ট্যাম্প পড়ুন (বাইট 40-47)
long transmitTime = 0;
for (int i = 40; i < 48; i++) {
transmitTime = (transmitTime << 8) | (buffer[i] & 0xFF);
}
// NTP টাইমস্ট্যাম্প (1900-এ থেকে) -> Unix টাইমস্ট্যাম্প (1970-এ থেকে)
return (transmitTime / 0x100000000L) - OFFSET_1900_TO_1970;
}
}
// ব্যবহার (ব্যাকগ্রাউন্ড থ্রেডে):
new Thread(() -> {
try {
long ntpTimeMillis = NTPClient.getNTPTime() * 1000L;
runOnUiThread(() -> {
Date date = new Date(ntpTimeMillis);
textView.setText(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(date));
});
} catch (IOException e) {
e.printStackTrace();
}
}).start();
HTTP হেডার থেকে টাইম পাওয়ার সহজ পদ্ধতি
// OkHttp ব্যবহার করে
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("https://www.google.com").build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
String dateHeader = response.header("Date"); // RFC 1123 ফরম্যাট
if (dateHeader != null) {
SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
Date serverDate = sdf.parse(dateHeader);
runOnUiThread(() -> textView.setText(serverDate.toString()));
}
}
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
});
অনুমতি প্রয়োজন
<uses-permission android:name="android.permission.INTERNET" />
সারাংশ
ডিভাইসের লোকাল টাইম পাওয়া সহজ (Calendar.getInstance()), কিন্তু সেটি ইউজার পরিবর্তন করতে পারে। সঠিক টাইমের জন্য NTP বা HTTP Date হেডার ব্যবহার করুন, তবে নেটওয়ার্ক কল ব্যাকগ্রাউন্ড থ্রেডে করুন।